티스토리 뷰

programmers.co.kr/learn/courses/30/lessons/42842?language=java

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

   public static int[] solution(int brown, int yellow) {
   	 int sum = brown + yellow;
         int heigth = 0;

         for(int i = 1; i < sum; i++) {
             if(sum % i == 0) {
                 if(sum / i < i) {
                     break;
                 }
                 heigth = i;
             }
         }
         
         int[] result = {sum / heigth, heigth};
         
         return result;
  }

처음 생각은 이랬다.

1) 사각형 넓이 = 가로 x 세로

2) 주어진 사각형 넓이 = brown + yellow

3) brown + yellow = x * y

4) x와 y는 최대값이어야된다고 생각했다. (brown = 24 / yellow = 24 / 기대값 = [8, 6])

테스트 케이스는 무난하게 돌았지만 결과적으론 실패

전체 사각형 개수는 맞지만 색깔별 개수가 달라져서 실패가 되는듯 싶었다.

그래서 다시 블록을 만들면서 개수를 확인하기로 했다.

    public static int[] solution(int brown, int yellow) {

        int width = 0;
        int height = 0;

        for(int i = 1; i <= yellow; i++) {
            if(yellow == 1) {
                height = i + 2;
                width = (brown + yellow) / height;
                break;
            }

            if(yellow % i == 0) {
                if(brown == i * 2 + (yellow / i + 2) * 2) {
                    height = i + 2;
                    width = yellow / height;
                    break;
                }
            }
        }

        int[] result = {width , height};

        return result;
    }

yellow를 기준으로 brown 개수를 구하고 맞으면 가로 세로 길이를 구했다.

for loop의 i는 yellow의 세로길이라고 생각하고

brown의 가로개수는 (yellow 가로길이 + 2) * 2

brown의 세로개수는 (yellow 세로길이(위 코드 기준 i) + 2) * 2

댓글