Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
입출력 예
brown | yellow | return |
---|---|---|
10 | 2 | [4, 3] |
8 | 1 | [3, 3] |
24 | 24 | [8, 6] |
반복문을 통해 카펫의 한 변의 길이(i)를 구하고, i와 나누어 떨어지는 다른 변의 길이를 구한다. 가로/세로 최소 숫자는 3이므로 3부터 시작하고, 작은수부터 반복문을 돌고 제한은 가로길이가 더 길다했으므로 i는 세로가 될 것이다.(더 작은 약수)
그렇게 구한 가로 세로의 길이로 갈색 카펫의 개수와 노란 카펫의 개수를 구한 후 해당 개수와 입력받은 brown과 yellow 값이 일치한다면 그 가로/세로를 리턴한다.
let brown_num = i * width - 2;
라고 단순하게 계산했는데 정사각형과 몇몇 숫자에서 잘못된 계산이 나와 한참 해맸었다. (가로+세로)*2 -4(네 모서리 개수)
가 올바른 계산이었다.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];
}
}
}
}