본문 바로가기
Coding/Coding Test Bookmark

[Coding Test Bookmark]카펫(java,프로그래머스)

by Thompson 2024. 9. 11.
728x90
문제 설명

 

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 사항
  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

 

Java
class Solution {
    public int[] solution(int brown, int yellow) {
        int total = brown + yellow;
        
        for (int h = 3; h <= total / h; h++) {
            int w = total / h;
            if ((w - 2) * (h - 2) == yellow) {  
                return new int[] {w, h};  
            }
        }
        return null; 
    }
}

 

Tip.

왜 최소한 3부터 시작할까?

카펫은 가장자리 1줄이 갈색이고, 가운데가 노란색입니다. 그런데 만약 세로 길이가 2나 1이면, 가운데에 노란색 격자를 둘 공간이 없기 때문에 노란색 중앙 부분이 없어서 조건에 맞지 않습니다. 그래서 세로가 3 이상이어야 중앙에 노란색 격자가 생길 수 있습니다.

 

(w - 2) * (h - 2)의 의미

  1. w는 카펫의 가로 길이
  2. h는 카펫의 세로 길이

문제에서 갈색은 테두리에만 있고 노란색은 가운데에만 있고, 테두리를 제외하고 가운데 부분의 크기를 구하려면, 양쪽 테두리(좌우와 상하)가 각각 1칸씩 차지하니까, 테두리를 제외한 가운데의 가로는 w - 2, 가운데의 세로는 h - 2가 됩니다.