문제 설명 : Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항 : 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
public class Solution {
public int[] solution(int brown, int yellow) {
for (int hInner = 1; hInner * hInner <= yellow; hInner++){
if (yellow % hInner != 0) continue;
// 내부 가로 (yellow 가로)
int wInner = yellow / hInner;
// 전체 가로 (yellow + brown)
int w = wInner + 2;
// 전체 세로 (yellow + brown)
int h = hInner + 2;
int brownNeeded = 2 * w + 2 * h - 4;
if (brownNeeded == brown && w >= h){
return new int [] {w, h};
}
}
// 이론상 도달 X
return new int[] {};
}
}
노란색 내부 크기 yW * yH = yellow 에서 (yH, yW)와 (yW, yH)를 둘 다 볼 필요가 없기 때문에 약수쌍을 한 번씩만 보기 위해 hInner * hInner <= yellow로 범위 제한
yellow % hInner != 0 인 경우 제한사항에 충족하지 않으므로 continue로 넘긴다.
yellow % hInner == 0 조건 충족하는 경우에 wInner가 hInner보다 같거나 큰 경우 이기에 이때 전체 가로와 세로를 구한 뒤 brown의 격자 개수를 구한다.


전체 가로와 전체 세로 크기를 구할 때 뒤에 + 2를 하는 이유는 brown은 바깥 테두리 영역이고 두께 1칸이기 때문에 wInner 기준 좌우에 각각 1칸씩 전체 가로는 합쳐서 + 2, hInner 기준 위아래에 각각 1칸씩 전체 세로는 합쳐서 +2가 된다.
이때 brown이 칠해진 격자의 개수는 w를 2번 곱하고, h를 2번 곱한 값에서 겹치는 모서리 구간 4개를 빼준 값이다.
그래서 2 * w + 2 * h - 4로 구해준 뒤 매개변수로 받은 brown의 격자 개수와 비교후 일치하고 전체 길이 w >= h보다 큰 경우 결과값을 반환해준다.
만약 for문이 끝날 때까지 return되지 않는 경우 조건이 충족하는 경우가 없으므로 빈 배열을 반환해준다.
'프로그래머스' 카테고리의 다른 글
| 4일차 - 귤 고르기 (0) | 2025.09.03 |
|---|---|
| 3일차 - 점프와 순간이동 (0) | 2025.09.02 |
| 2일차 - 피보나치 수 (0) | 2025.09.01 |
| 2일차 - 다음 큰 숫자 (0) | 2025.09.01 |
| 1일차 - 이진 변환 반복하기 (1) | 2025.08.25 |