본문 바로가기

코딩/프로그래머스

[프로그래머스/JAVA] 고득점Kit > 완전탐색 > 카펫 (by 다알쥐AI)

728x90

고득점Kit > 완전탐색 > 카펫 

 

 

※ 주의 : 문제풀이 방법은 다양합니다. 참고만 해주세요

[문제설명]

더보기

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

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

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

제한사항

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

입출력 예


[간단설명]

갈색, 노란색 카펫 개수를 유추해서 전체 카펫의 넓이를 구하고, 가로, 세로 길이를 리턴하는 문제

 

[접근방법]

1. 전체 넓이를 구한다.
2. 가로, 세로 길이의 최소값, 최대값을 지정한다.

3. 문제의 조건을 만족하는 가로, 세로 길이를 찾는다.

  1) 전체 넓이 = 가로 x 세로

  2) 노란색 넓이 = (가로-2) x (세로 -2)

  3) 가로 >= 세로

 

[주의사항]

1. 문제를 잘 읽고, 갈색이 노란색을 1칸씩 감싸는 내용을 이해헤야한다.

2. 문제의 조건을 모두 만족시켜야 한다.(특히, 노란색 넓이)

 

[소스공개]

class Solution {
    public int[] solution(int brown, int yellow) {
        // 정답 배열
        int[] answer = new int[2];
        
        // 넓이 = 갈색 + 노란색
        int area = brown+yellow;
        
        // 가로, 세로 최소값(3) 
        // ex) 가로 : 노란색 최소값 1 이면, 갈색은 양옆 2 필요(1+2=3)
        // ex) 세로 : 노란색 최소값 1 이면, 갈색은 위아래 2 필요(1+2=3) 
        int start = 3;
        
        // 가로, 세로 최대값(넓이/3)
        // ex) 가로, 세로 최소값 3부터 시작이기 때문에, 
        // ex) 최대값은 (넓이/3) 까지만 탐색하면 됨.
        int end = area/3;
        
        // 완전 탐색
        for(int w=start;w<=end;w++){
            for(int h=start;h<=end;h++){
                // 1) 넓이가 w*h 이면서
                // 2) 위아래, 양옆 가장자리를 뺀 넓이가 노란색이면서
                // 3) 가로가, 세로보다 크거나 같으면 
                if((w*h==area) && ((w-2)*(h-2)==yellow) && w>=h){
                    answer[0]=w;
                    answer[1]=h;
                    return answer;
                }
            }
        }
        return answer;
    }
}

 

[실행결과]

728x90