문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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]

 

문제 풀이

우선 카펫의 전체 너비는 갈색 격자와 노란 격자를 합한 값이 되고, 그건 가로*세로와 같다.

전체 너비(total) = brown + yello = 가로 * 세로

 

그리고 카펫의 테두리의 1줄은 갈색으로 칠해져 있다고 했으므로, 

노란 격자의 양 옆과 위, 아래로 갈색 격자가 1개씩 있어야 하기때문에 아래와 같은 식이 성립한다.

노란 격자(yellow) = (가로 - 2) * (세로 - 2)

 

두 식을 통해 갈색 격자는 아래와 같은 식을 만족한다.

갈색 격자(brown) = 총 너비(total) - yello

 

결국, 노란 격자와 갈색 격자의 식을 모두 만족하는 가로, 세로 조합을 구하면 되는 문제!

 

[알고리즘, 구현방법]

이 문제는 가로*세로 조합에 대한 탐색이 필요하므로, 완전 탐색으로 풀었다.

 

[풀이 과정]

  1. 가로*세로 조합 탐색 (가로가 큰 기준)
  2. 총 너비를 가로로 나누었을때, 나머지가 생기지 않는 경우, 즉 나누어 떨어지는 경우만 탐색
    • 각 조합마다 가로와 세로가 yellow, brown 식에 대입했을때 모두 true인 경우가 정답
  3. 정답이 나올때까지 반복

 

[구현시 고려한 사항]

카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길기때문에 조합을 탐색할때 가로가 큰 경우부터 확인한다.

 

 코드

class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];
        int total = brown + yellow;

        // 가로 길이 <= 세로 길이 이므로, 가로 길이가 큰 것 부터 탐색
        for (int width=total; width>0; width--) {
            if (total % width != 0) continue; // 나누어 떨어지지 않는 경우 넘어가기

            int height = total / width;
            int y = (width-2) * (height-2);
            if (brown == total - y && yellow == y) {
                answer[0] = width;
                answer[1] = height;
                break;
            }
        }
        return answer;
    }
}

 

+ Recent posts