Home

[Coding Test] Programmers - Level 2. 카펫

42842. 카펫를 풀고 문제를 푼 기록이다. 언어는 JS를 사용하였다.

42842. 카펫

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

사각형

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

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

제한사항

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

입출력 예

brown yellow return
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

풀이

간만에 풀어본 완전 탐색 문제이다. DP에 비해서 완전 탐색은 많이 풀어보지 않아서 약간 헤매긴 했는데.. 그래도 검색안해보고 잘 풀어 냈다.

function solution(brown, yellow) {
    const area = brown + yellow;
    let height = 0;
    let width = 0;

    const result = [];
    for (let i = 3; i <= area / 3; i += 1) {
        if (area % i === 0) {
            const tmpHeight = i;
            const tmpWidth = area / i;
            
            if (tmpHeight > tmpWidth) {
                break;
            }

            if (tmpHeight * 2 + (tmpWidth - 2) * 2 === brown) {
                height = height < tmpHeight ? tmpHeight : height;
                width = tmpWidth;    
            }
        } else {
            continue;
        }
    }

    return [width, height];
}

일단 노란색 사각형을 감싸기 위해서는 세로 길이가 무조건 3이상이어야 한다. for문을 통해서 높이를 1씩 증가 시키는데, 일단 해당 i 번째 세로 길이일 때 사각형이 될 수 있는지를 체크한다. 사각형이 되지 못하면 그냥 넘겨버린다.

사각형이 되더라도 세로 길이가 가로보다 길게 되면 break 되는데, 그 이후는 볼 필요도 없이 크기 때문에 break로 for문을 빠져나온다.

이제 사각형도 되고, 세로 길이가 가로 길이보다 만족하는 경우 마지막 체크를 한번 해야 한다. 바로 해당 사각형이 조건에 맞는 사각형인지 체크하는 것이다. 만약 이 체크를 하지 않는다면 단순히 해당 넓이로 만들 수 있는 넓이가 가장 큰 사각형이란 조건이 되버린다.

brown 사각형은 맨 바깥쪽 칸만 차지하므로, 높이 2 + ( 가로 - 2 ) 2로 계산할 수 있다. 가로에서 2를 빼는 이유는 세로값에서 포함되기 때문이다. 해당 값이 입력된 brown 값을 만족하는지 체크하고 만족하면 해당 값을 넣어주면 된다.

꽤 오랜만에 푸는 완전 탐색 문제였는데, 다른 문제보다 시간은 10분정도 더 걸렸지만 재미있게 풀었다.

결과

채점 결과
정확성: 100.0
합계: 100.0 / 100.0
Loading script...