본 캠프
리액트 심화 프로젝트 (4)
Iruka913
2024. 12. 26. 21:18
신나는 알고리즘 풀이 시간.
문제 이해
Leo는 아래 그림처럼 노란색과 갈색 격자로 구성된 카펫을 보고 가로와 세로의 크기를 유추하려 합니다.
- 갈색 격자(brown): 테두리를 이루는 격자의 개수
- 노란색 격자(yellow): 중앙에 위치한 격자의 개수
예를 들어, 갈색 격자가 10개, 노란색 격자가 2개일 때, 카펫의 가로와 세로는 각각 4와 3입니다.
제한사항
- 갈색 격자 개수는 8 이상 5000 이하의 자연수
- 노란색 격자 개수는 1 이상 2,000,000 이하의 자연수
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
문제 풀이 과정
문제를 해결하기 위해 아래의 순서로 접근했다.
1. 총 격자 수 계산
카펫의 전체 격자 수는 갈색과 노란색 격자의 합이었다.
const total = brown + yellow;
2. 가능한 가로와 세로 조합 찾기
전체 격자 수의 약수를 이용해 가로(width)와 세로(height)의 조합을 구했다. 이때 가로는 세로보다 크거나 같아야 하므로, 약수를 탐색할 때 조건을 추가했다.
3. 노란색 격자 영역 검증
가로와 세로가 결정되었을 때, 노란색 영역의 크기를 계산해 조건에 맞는지 확인했다.
- 노란색 영역:
- yellow = (width - 2) * (height - 2)
4. 조건에 맞는 결과 반환
위 조건을 만족하면 가로와 세로를 배열로 반환했다.
function solution(brown, yellow) {
const total = brown + yellow;
for (let height = 3; height <= Math.sqrt(total); height++) {
if (total % height === 0) {
const width = total / height;
if ((width - 2) * (height - 2) === yellow) {
return [width, height];
}
}
}
}
5. 트러블 슈팅.
if ((width - 2) * (height - 2) === yellow) {
return [width, height];
}
이 부분에서 width - 2, height -2 이 부분에 괄호를 쳐주지 않으면 제대로 계산이 되지 않는다. 이 부분은 프리티어로도 해결이 되지 않는 문제기 때문에, 수동으로 괄호를 씌워줘야만 했다.