코딩테스트
[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]의 값이 나오게 됐다.