브라운 = 0
엘로우 = 1
[
[0,0,0],
[0,1,0],
[0,0,0]
]
[
[0,0,0,0],
[0,1,1,0],
[0,0,0,0]
]
[
[0,0,0,0,0],
[0,1,1,1,0],
[0,0,0,0,0]
]
[
[0,0,0,0,0,0,0,0],
[0,1,1,1,1,1,1,0],
[0,0,0,0,0,0,0,0]
]
[
[0,0,0,0,0],
[0,1,1,1,0],
[0,1,1,1,0]
[0,0,0,0,0]
]
[
[0,0,0,0,0,0]
[0,1,1,1,1,0]
[0,1,1,1,1,0]
[0,0,0,0,0,0]
]
[
[0,0,0,0,0,0,0,0],
[0,1,1,1,1,1,1,0],
[0,1,1,1,1,1,1,0],
[0,1,1,1,1,1,1,0],
[0,1,1,1,1,1,1,0],
[0,0,0,0,0,0,0,0]
]
결론은 옐로우의 가로,세로 길이는 브라운의 가로의 길이 - 2 , 세로의 길이 -2 이다.
바보같이 이 패턴을 빨리 찾지 못한것이 조금 아쉽다. 역시 그림을 그려봐야 한 눈에 들어온다 그림을 그리자!
function solution(brown, yellow) {
let sum = brown + yellow;
let temp = [];
for (let i = 2; i <= Math.floor(sum / 2); i++) {
if (sum % i === 0) {
temp.push(i);
}//=> 약수를 담은 배열... 여기가 실수
}
const getHeightWidth = (temp, yellow) => {
let Width = temp.shift();
let Height = temp.pop();
let yellowWidth = Width - 2;
let yellowHeight = Height - 2;
//==> 약수를 구한 다음 양쪽으로 배열의 요소를 뺴내어 옐로우의 가로세로 길이를 구할수 있음
return yellowWidth * yellowHeight === yellow
? [Height, Width]
: getHeightWidth(temp, yellow);
}; //=> 그 후 곱한 값이 본래 옐로우 값과 맞으면 리턴하고 다시 반복하는 형식 그러나 이 부분이 엄청 비효율적이라서 테케에서 런타임오류를 이르킴...
return getHeightWidth(temp, yellow);
}
그래서 여러 다른 분들 코드를 참고하고 생각을해서 수정을 했음.
function solution(brown, yellow) {
let sum = brown + yellow;
for (let i = 2; i <= Math.floor(sum / 2); i++) {
let Width = i;
let Height = sum / i;
if (sum % i !== 0) continue;
if ((Width - 2) * (Height - 2) === yellow)
return [Math.max(Width, Height), Math.min(Width, Height)];
}
}
이렇게 하면 굳이 배열에 또 저장할 필요 없고 바로 검사하며 결론을 낸다. 비효율을 줄이자!!