[프로그래머스/자바] 완전탐색 > 카펫

    728x90
    반응형
     

    프로그래머스

    SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr

    완전탐색 > 카펫

    문제설명

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

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

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


    제한사항

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

    입출력 예

    brown yellow return
    10 2 [4, 3]
    8 1 [3, 3]
    24 24 [8, 6]

    코드

    class Solution {
        public int[] solution(int brown, int yellow) {
            return carpet(brown, yellow);
        }
    
        /**
         * 카펫의 가로 세로 사이즈를 계산해 리턴
         * @param brown 갈색 격자의 수
         * @param yellow 노란색 격자의 수
         * @return 카펫의 가로, 세로 크기를 순서대로 담은 배열
         */
        public int[] carpet(int brown, int yellow) {
            int size = brown+yellow;
            int a=0, b=0;
    
            // 효율성을 늘리기 위해 제곱근까지만 탐색
            for (int i=3; i<=Math.sqrt(size); i++) {
                if (size%i==0) {
                    // 계산된 가로, 세로의 길이가 brown의 갯수랑 맞는지 확인
                    if (brown == 2*i+2*(size/i)-4) {
                        a=i;
                        b=size/i;
                        break;
                    }
                }
            }
            return new int[] {b, a};
        }
    }

    결과

    728x90
    반응형

    댓글