프로그래머스 Lv.2 - 카펫

Yuni·2023년 7월 3일
0

Algorithm

목록 보기
4/27
post-thumbnail

문제 설명

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]


접근방법

반복문을 통해 카펫의 한 변의 길이(i)를 구하고, i와 나누어 떨어지는 다른 변의 길이를 구한다. 가로/세로 최소 숫자는 3이므로 3부터 시작하고, 작은수부터 반복문을 돌고 제한은 가로길이가 더 길다했으므로 i는 세로가 될 것이다.(더 작은 약수)

그렇게 구한 가로 세로의 길이로 갈색 카펫의 개수와 노란 카펫의 개수를 구한 후 해당 개수와 입력받은 brown과 yellow 값이 일치한다면 그 가로/세로를 리턴한다.

  1. yellow와 brown의 카펫 개수를 더한 total 변수를 설정한다.
  2. brown은 최소 yellow 1개 를 포함해야 하므로 전체 카펫의 길이는 가로/세로 최소 3부터 시작하므로 i는 3부터 돈다. 약수를 찾아내는데, 모든 약수를 찾아낼 것 없이 제곱근(Math.sqrt())을 사용하여 시간을 단축한다.
  3. 세로(i)를 구한 뒤 가로를 구하고, 구한 가로 세로를 이용해 brown 카펫의 개수를 구한다.
    처음에 let brown_num = i * width - 2; 라고 단순하게 계산했는데 정사각형과 몇몇 숫자에서 잘못된 계산이 나와 한참 해맸었다. (가로+세로)*2 -4(네 모서리 개수) 가 올바른 계산이었다.
  4. total 개수 - brown 카펫의 개수 = yellow 카펫의 개수가 되고, 이렇게 계산된 값이 입력받은 brown, yellow 값과 일치하다면 해당 가로(width), 세로(i)길이를 리턴해준다.

코드

function solution(brown, yellow) {
    var total = brown + yellow;

    for(let i=3; i<=Math.sqrt(total); i++) {
        if(total%i === 0) {
            let width = total / i;
            let brown_num = (i + width) * 2 - 4;
            let yellow_num = total - brown;
            
            if(brown_num === brown && yellow_num === yellow) {
                return [width, i];
            }
        }
    }
}
profile
Look at art, make art, show art and be art. So does as code.

0개의 댓글