Programmers lv.2 카펫(완전탐색)(JS)

김희산·2023년 6월 30일
0

Algorithm

목록 보기
5/7

카펫

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brownyellowreturn
102[4, 3]
81[3, 3]
2424[8, 6]

처음 풀이

function solution(brown, yellow) {
    var answer = [];
    let num = brown + yellow;
    for (let i = 1; i <= num; i++) {
        if (num % i === 0) {
            let temp = num / i
            if(i >= temp){
                answer.push(i)
                answer.push(temp)
                break;
            }
        }
    }
    return answer;
}

문제를 보고 결국 brown격자와 yellow격자의 합이 곧 총 가로 x 세로 라고 생각했기 때문에 total의 약수를 전부 구하는 과정에서 답을 찾기로 했다.
예를 들어 brown이 10, yellow가 2 이라면 합이 12이고,
12의 약수는 [1,2,3,4,6,12] 이다. (1, 12), (2, 6), (3,4), (4,3) ... 이렇게 짝을 이루면서 구해볼 수 있는 데 문제의 조건에서 가로의 길이가 세로의 길이보다 같거나 크기 때문에 약수의 중간값 2개가 곧 가로와 세로의 길이가 되고, i가 4가되는 순간 temp는 3이 되어서 [4,3] , 즉 이 값이 정답이라고 생각하였다.
보다시피 4,6,7 테스트케이스가 통과가 되지 않았고 다른 사람의 풀이를 보던 중에 파라미터가 18,6 으로 들어왔을 때 합이 24이고 반환된 값은 [6,4]가 되었다. 하지만 가로의 길이가 6, 세로의 길이가 4가 된다면 brown의 갯수가 16개이고 yellow의 갯수가 8개가 된다.
입력값의 각각의 격자 수와 일치하지 않는다.

아무래도 이렇게 들어오는 입력값 때문에 통과가 되지 않는 테스트케이스가 있는 것 같아서 다시 아래와 같이 풀이를 수정했다.

예외 케이스 발견 후 풀이

function solution(brown, yellow) {
    var answer = [];
    let total = brown + yellow;
    for (let height = 3; height <= total; height++) {
        if (total % height === 0) {
            let width = total / height;
            // 갈색 격자의 수는 노란색 격자를 둘러싸는 테두리이기 때문에 이 조건에 만족해야함.
            if (2 * (width + height - 2) === brown) {
                return [width, height];
            }
        }
    }
}

위의 코드와 거의 흡사하지만 파라미터로 들어오는 갈색 격자의 수를 검사하는 로직을 넣어주었다. 그렇게 해서 6위에서 언급한 입력값이 (18,6)이 들어왔을 때 조건을 만족하는 [8,3]을 반환해서 제대로 된 값을 구할 수 있었고 모든 테스트에 통과 할 수 있었다.

profile
성공은 제로섬 게임이 아니라 주변인들과 함께 나아가는 것이다.

0개의 댓글