민규의 흔적

[JavaScript 자바스크립트] 프로그래머스 - 카펫 본문

프로그래머스

[JavaScript 자바스크립트] 프로그래머스 - 카펫

민규링 2024. 6. 30. 15:47

2024년 6월 30일

문제 링크 : 프로그래머스 - 카펫


문제 접근

 

문제에 어떤 규칙이 있는지 먼저 알아야 한다고 판단했다.

 

1. 카펫 테두리 1줄은 갈색(brown)으로 칠해져 있다.

2. 테두리 1줄을 제외한 내부는 모두 노란색(yellow)이다.

3. 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다.

 

 

brown = 24, yellow = 24인 경우를 보자.

 

yellow가 24만큼 칸을 차지하려면 다음과 같은 가로, 세로 조합을 가질 수 있다.

 

가로 세로
24 1
12 2
8 3
6 4

 

각각의 모든 경우에, 테두리 1줄을 차지하는 brown 몇 칸을 차지하게 되는지를 계산해보고, brown이 24칸을 차지하는 경우의 가로,세로 조합을 출력하면 된다.

 

가로 세로 brown
24 1 54
12 2 32
8 3 26
6 4 24

 

brown이 24를 차지하는 경우는 yellow가 가로 = 6, 세로 = 4인 경우이다.

brown은 yellow를 1줄 만큼 더 둘러싸고 있으므로 카펫의 총 가로, 세로 길이 조합은 [8, 6]이 되는 것이다.

 

따라서, yellow가 N칸을 차지하고 있을 때, N의 약수를 모두 구하여 각 가로, 세로 조합쌍의 모든 경우를 확인하며 brown이 차지하는 칸의 개수만큼의 조합을 알아내어 카펫의 가로, 세로 길이를 구하면 된다.

 


전체 코드

 

function solution(brown, yellow) {
    var answer = [];

    // (가로 + 세로) * 2 + 4 == brown일 때의 [가로, 세로]가 정답

    // Math.floor(yellow / 2) + 1 까지 확인하는 이유는 yellow가 1일 때도 있기 때문. + 1 을 해주지 않으면 반복문을 수행하지 않음
    for (let i = 0; i < Math.floor(yellow / 2) + 2; i++) {
        if (yellow % i === 0) {
            if ((yellow / i + i) * 2 + 4 === brown) {
                answer.push(yellow / i + 2);
                answer.push(i + 2);
                break;
            }
        }
    }

    return answer;
}

console.log(solution(8, 1))

풀이 후기

 

규칙을 찾아 yellow 개수의 약수를 구하고, 각 조합쌍의 모든 경우의 수를 체크하여 결과를 도출해야하는 완전탐색 문제였다.