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] |
어떤 카펫이든 테두리 한줄만 갈색으로 칠해져 있다.
가운데 노란색 부분의 가로길이를 x
, 세로길이를 y
라고 한다면, 전체 카펫의 가로길이는 x+2
, 세로길이는 y+2
이다.
노란색 부분과 전체 카펫의 넓이는 각각 아래처럼 나타낼 수 있다.
1번을 통해, x
와 y
가 될 수 있는 후보들은 yellow
의 약수 집합이라는 것을 알 수 있다.
예를 들어 yellow
가 24라면 x
와 y
의 후보는 다음과 같다.
x | y |
---|---|
24 | 1 |
12 | 2 |
8 | 3 |
6 | 4 |
이 후보 중에서 2번 식을 만족하는 값을 찾아 반환하면 된다.
만큼 반복문을 돌면서 정답이 나온다면 return 하기 때문에 실행시간이 길지 않다.
소스코드
function solution(brown, yellow) {
// yellow의 약수 중 답이 되는 값만 return
for (let i=1; i<=Math.sqrt(yellow); i++) {
if (yellow%i === 0 && brown+yellow === (yellow/i+2)*(i+2))
return [yellow/i+2, i+2];
}
}