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

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
brown : 10
yellow : 2
[4, 3]
i와 j를 3부터 1씩 증가시키면서, i가 j보다 작거나 같을 경우 다음 방법을 반복 수행한다. (3부터 brown까지 진행하는 이유는 width와 height는 최소 3이상이어야 격자 무늬를 만들 수 있기 때문이고, brown까지 진행한 이유는 큰 의미없다. 무조건 정답이 있는 상황을 가정했기 때문에 brown 전까지 진행하지 않기 때문. (즉, 변수 중 영향을 절대 받지 않는 수를 적을 뿐이지, 실제로는 비워두어도 상관없다.) (i가 j보다 작거나 같아야 하는 이유는 조건에서 가로 길이가 세로와 같거나 길다고 한정했고 i를 width로 둘 것이기 때문에 i가 j 이상이어야 한다.)
width에 i를 height에 j-2를 더한 값을 저장한다. (height에 j-2를 하는 이유는 테두리 1줄이 갈색이라는 조건때문이다. 그러므로 j는 전체 height이고, height에 저장된 값은 갈색 부분을 제외한 height이다.)
brown의 개수는 width×2+2×height이고, yellow는 (width-2)×height이므로, 해당 값이 brown과 yellow와 같을 경우 answer에 [i, j]를 저장해준 뒤, 반복문을 탈출한다. (brown과 yellow의 개수는 계산해보면 알 수 있다. 맨 윗 줄과 아랫 줄은 갈색만 존재하기 때문에 2×width를 해주면 된다. 노란색을 갈색이 양끝에서 감싸고 있으므로 노란색의 height×2를 해주면 노란색을 감싸는 갈색의 개수이다. 이 둘을 더해주면 brown의 총개수이다. 노란색은 갈색이 양 끝에서 감싸고 있으므로 width-2를 해주면 노란색의 width이다. 이를 노란색의 height와 곱해주면 yellow의 총개수이다.)
function solution(brown, yellow) {
var answer = [];
let width = 0;
let height = 0;
for(let i=3; i<=brown; i++) {
for(let j=3; j<=brown; j++) {
if(i<j) continue;
width = i;
height = j-2;
if((width*2)+(2*height)===brown && (width-2)*height===yellow) {
answer = [i, j];
break;
}
}
}
return answer;
}
이 문제를 이틀에 걸쳐서 풀이하게 됐다. 실질적인 풀이 시간은 2시간도 안 되긴 하지만.. 어제 유독 문제가 너무 안 풀렸던 날이었고, 해당 문제에 풀이 방법이 전혀 떠오르지 않았다. 그렇게 내일 풀기로 다짐하고 오늘 도움없이 온전히 풀어보자 생각하고 풀이했는데 한 번에 풀이했다..

안 풀리는 날에는 과감하게 쉬어가라던데.. 그 말이 정말인 것 같다. (어쩜 이래...)
다른 사람들의 풀이를 보면 식이 따로 있던데 그 식은 앞으로의 내가 풀이할 수 없을 것 같더라.. (후다닥 풀어야하는데 저런 식을 어떻게 떠올리지?????????) 내가 생각한 식을 변형하면 그 식이 나오려나... 남들과 다르게 풀이하는 게...... 좋은지는 잘 모르겠지만 해당 알고리즘이 심각하게 복잡하거나 시간초과가 나오지 않기에 이 문제는 이렇게 풀이하도록 하겠다.