알고리즘/프로그래머스

[프로그래머스] 카펫_JAVA

jimkwon 2022. 2. 22. 15:32
반응형

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

 

yellow와 brown의 타일 개수가 주어진 후, 가로 세로를 구하는 문제이다.

  • 갈색 타일은 항상 테두리 1줄만 노란색 타일을 감싸고 있다.
  • 중앙의 노란색 타일은 항상 사각형이다.
  • 늘 가로가 세로보다 길거나 같다.

해당 조건을 생각해 보았을 때, 필자는 하나의 공식을 세울 수 있었다.

(타일의 가로 * 세로) - (yellow 가로 * 세로) = brown 타일 개수

현재 우리에겐 brwon타일 개수, yellow의 타일 개수가 주어졌다.

아래 사진과 같이 전체 타일의 가로와 세로는 yellow 타일의 가로, 세로 + 2 임을 알 수 있으므로 공식에 필요한 변수가 성립한다!

 

 

1. yellow 수에 대한 약수를 구한다. (사각형이므로 yellow의 가로, 세로 후보를 구할 수 있다)

2. 구한 한 쌍의 약수에 각각 +2를 더한다. 해당 값은 각각 타일의 가로, 세로가 된다.

3. 위의 공식 기준으로 (타일의 가로 * 세로) - (yellow 가로 * 세로) = brown타일 개수가 성립하는지 확인한다.

4-1. 성립할 경우 해당 공식의 타일 가로, 세로값을 return

4-2. 성립하지 않을 경우 yellow의 다음 약수를 구해 2~3을 반복한다.

 

import java.util.Arrays;
class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = {0, 0};
        
        for (int i = 1; i * i <= yellow; i++) {
            if (yellow % i == 0) {
                answer[0] = yellow / i + 2; //가로가 세로보다 커야 하므로
                answer[1] = i + 2;
                if (answer[0] * answer[1] - i * yellow / i == brown)
                    return (answer);
            }
        }
        return answer;
    }
}

공식만 찾으면 아주 easy한 문제!