2026.03.26
문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예
소요 시간: 33분
yellow+brown=w*h
전체 'w', 'h' =yello의w + 2,h + 2를 활용하여 풀었음class Solution { public int calculate(int w, int h) { return (w * h); } public int[] solution(int brown, int yellow) { int w, h; int [] answer = new int[2]; for (int i = 1; i <= yellow; i++) { if (yellow % i == 0) { w = yellow / i; h = i; while(true) { w += 2; h += 2; if (calculate(w, h) == brown + yellow) { answer[0] = w; answer[1] = h; return answer; } else if (calculate(w, h) > brown + yellow) { break; } } } } return answer; } }
AI 코드
전체 넓이 = brown + yellow
전체 둘레 = brown + 4(모서리 때문에)
w + h = (brown + 4) / 2
w * h = brown + yellow
w + h = s,w * h = p
(x - w)(x - s) = 0
x² - (w + h)x + w * h = 0
x² - sx + p = 0
x = (s ± √(s² - 4p)) / 2이 때,
w > h이므로
w = x = (s + √(s² - 4p)) / 2
h = x = (s - √(s² - 4p)) / 2문제를 해결할 때 방정식도 적극적으로 활용해야 겠다는 생각을 했음
class Solution { public int[] solution(int brown, int yellow) { int s = (brown + 4) / 2; // w + h int p = brown + yellow; // w * h int w = (s + (int)Math.sqrt(s * s - 4 * p)) / 2; int h = s - w; return new int[]{w, h}; } }