카펫

하이솝·2026년 3월 26일

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' = yellow + 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};
    }
}

0개의 댓글