코딩테스트

[JS] 완전탐색 > 카펫

차차한 2022. 9. 13. 15:14

function solution(brown, yellow) {
    var answer = [];
    var sum = brown + yellow;
    
    for(var i = sum; i >= 1; i--){
        
        if(sum % i == 0){
            answer.push(i);
        }
    }
    
    for(var i = 0; i < answer.length; i++){
       for(var k = 1; k < answer.length; k++){ 
            
           if((answer[i]-2) * (answer[k]-2) == yellow){

               return [answer[i], answer[k]];
           }
       }
    }
}

이번 문제의 핵심은 노란 타일 부분은 중간에 있고 갈색 테두리 한 줄이 감싸고 있다는 것이다.

그것을 간과하고 풀면 TC 4,6,7에서 계속 오류가 발생한다..

for(var i = sum; i >= 1; i--){
        
        if(sum % i == 0){
            answer.push(i);
        }
    }
//	[ 12, 6, 4, 3, 2, 1 ]

sum이 brown과 yellow를 더한 값을 담은 변수일 때, 

sum의 약수를 구해 answer 배열에 담아준다. 이 문제의 답은 [가로, 세로]로 리턴해야 하는데 가로가 세로보다 크거나 같으므로 약수를 구할 때 큰 수부터 담아준다.

for(var i = 0; i < answer.length; i++){
       for(var k = 1; k < answer.length; k++){ 
            
           if((answer[i]-2) * (answer[k]-2) == yellow){

               return [answer[i], answer[k]];
           }
       }
    }

약수가 담긴 배열을 반복하면서 (x-2)(y-2) == yellow의 조건을 검사한다.

brown은 겉 테두리에만 존재하므로 yellow는 전체 직사각형의 가로세로크기보다 2씩 작게 들어가있다.

해당 조건을 통과하는 값을 리턴해주면 된다.

 

 

 

 

-아래는 틀린 코드

function solution(brown, yellow) {
   var answer = [];
    var sum = brown + yellow;
    
    for(var i = sum; i >= 1; i--){
        
        if(sum % i == 0){
            answer.push(i);
        }
    }
    
    var arr = [];
    arr[0] = answer[Math.round(answer.length / 2) -1];
    
    if(answer[answer.length / 2] == undefined){
        arr[1] = arr[0]
    }else{
        arr[1] = answer[answer.length / 2];
    }
    
    return arr;
}

약수를 구하는 것까지는 동일했는데 yellow 조건을 생각하지 않고 풀어서 몇 TC는 통과할 수가 없었다.

예를 들어 18,6 이 주어진 값일 때, 답은 [8,3]이 나와야하는데, 나는 가장 중간에 있는 두 약수만 구해 리턴을 하다보니 

[6, 4]의 값이 나오게 됐다.