functionsolution(brown, yellow) {
// yellow 칸의 가로 세로를 각각 x,y라고 하면 전체 카페트는 [x+2,y+2] 이다.// 2*(x+y)+4 = brown 을 만족하는 x,y를 찾는다.for (let x = 1; x <= Math.sqrt(yellow); x++) {
// yellow의 약수가 되는 x를 찾는다.if (yellow % x === 0) {
const y = yellow / x;
if (2 * (x + y) + 4 === brown) {
return x >= y ? [x + 2, y + 2] : [y + 2, x + 2];
}
}
}
}
yellow의 가로, 세로의 길이를 각각 x,y라고 하면 전체 카페트는 yellow를 사방으로 감싸고 있는 형태이므로, x+2, y+2이다.
그리고, brown 영역은 yellow의 가로, 세로를 2배한 것에 양 끝 4칸을 포함하므로, 2*(x+y)+4 = brown을 만족한다.
따라서, yellow의 가로가 될 수 있는 x값을 찾고, 그 값이 2*(x+y)+4 = brown 인지를 판별한다.
yellow의 가로가 될 수 있는 값, 즉 약수를 찾기 위해 1부터 yellow의 제곱근을 씌운 값까지 1씩 증가시키며 아래를 반복한다.
만약 x가 yellow로 나뉘어진다면, (약수이면)
y는 yellow를 x로 나눈 값이다.
2*(x+y)+4 = brown 을 만족한다면, 정답을 리턴하는데, 더 긴 쪽이 가로라고 했으므로, x가 y보다 크거나 같으면 [x+2,y+2] , 작으면 [y+2,x+2]를 리턴한다. ( 하지만 1부터 증가시켜 약수를 찾았기 때문에 항상 x가 더 작은 값이긴 하다. )