[프로그래머스] 42842. 카펫

1 분 소요

문제 링크

[프로그래머스] 42842. 카펫


풀이 과정

주어진 갈색 격자의 수와 노란색 격자의 수를 가지고 만들어지는 배열의 가로, 세로 길이를 구하는 문제입니다.

먼저 문제에서 주어진 갈색 격자의 수와 노란색 격자의 수를 가지고 만들 수 있는 모든 배열의 모양을 뽑아 냅니다.

예를 들어, 입력 예에서 주어진 brown : 24, yellow : 24 를 가지고 생각해보면, 총 격자의 수는 24 + 24 = 48이 되고, 48개의 격자를 갖는 배열의 모양은 아래와 같습니다.

  • 1 x 48
  • 2 x 24
  • 3 x 16
  • 4 x 12
  • 6 x 8
  • 8 x 6
  • 12 x 4
  • 16 x 3
  • 24 x 2
  • 48 x 1

앞이 세로 길이, 뒤가 가로 길이라고 가정하면, 가로 길이가 세로 길이보다 같거나 길다 는 문제의 조건에 따라 다음 5 개의 경우는 제외됩니다.

  • 8 x 6
  • 12 x 4
  • 16 x 3
  • 24 x 2
  • 48 x 1

또한, 노란색 격자를 감싸는 테두리 가 필요하려면 세로의 길이는 최소 3 이상 이어야 합니다. 따라서, 다음 두 개의 경우는 제외됩니다.

  • 1 x 48
  • 2 x 24

위와 같은 조건을 만족하는 모든 가능한 경우의 수를 가지고, 실제 노란색과 갈색 격자의 개수를 매칭시켜 올바른 배열의 크기를 구할 수 있습니다.


코드

public class Main {
    public static int[] solution(int brown, int yellow) {
        int[] answer = new int[2];
        int sum = brown + yellow;

        int i = 3;
        while (true) {
            if (sum % i != 0) {
                i++;
                continue;
            }

            int column = i;
            int row = sum / i;

            if (column > row) break;

            int b = (row + column) * 2 - 4;
            int y = sum - b;

            if (b == brown && y == yellow) {
                answer[0] = row;
                answer[1] = column;

                break;
            }

            i++;
        }

        return answer;
    }

    public static void main(String[] args) {
//        int brown = 10;
//        int yellow = 2;

//        int brown = 8;
//        int yellow = 1;

        int brown = 24;
        int yellow = 24;

        solution(brown, yellow);
    }
}

카테고리:

업데이트:

댓글남기기