본문 바로가기

프로그래머스

3일차 - 카펫

문제 설명 : 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의 격자 개수를 구한다.

전체 가로와 세로 및 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