프로그래머스 | LV.2 카펫 - 완전 탐색 (Java)

728x90

⬛ 프로그래머스 | LV.2 카펫

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

 

프로그래머스

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

programmers.co.kr

문제 설명


💚 문제 접근 방식

  • 어떻게 풀어야 하는지 도저히 모르겠어서 풀이를 찾아봤고, 이해한 내용 토대로 정리했다.
  • 문제 제한 조건을 잘 확인해야 한다.

제한 사항

1) 노란색 격자 yellow는 최소 1이상의 값이 반드시 들어온다.

즉, 적어도 1개의 노란 격자가 중앙에 반드시 존재해야 한다.
이를 만족시키려면 그림처럼 격자 크기가 가로, 세로 모두 3이상의 값을 가져야 한다.

격자 최소 크기

2) 가로 길이 ≥ 세로 길이 (가로가 세로보다 크거나 같아야 한다.)

전체 카펫 사이즈 크기가 어떤 (가로, 세로) 크기로 구성될지 경우의 수를 좁히려면 (brwon+yellow 합) 에 대한 약수를 구해야 한다.
그 약수 중 (가로≥세로) 조건 만족하는 경우만 남긴다. 그러면 (4, 3) (6,2) (12,1) 만 남는다.

3) 또한 가로와 세로 길이는 모두 3이상이어야 하기 때문에 이를 만족 못하는 경우를 모두 제거하면 (4,3) 만 남게 된다.

남는 경우의 수

4) 마지막으로 문제 입력에서 주어진 yellow 개수만큼 노란 격자가 중앙에 위치하는 게 가능하려면 아래의 수식을 만족해야 한다.

  (가로-2) * (세로-2) = yellow 개수 // 이를 만족하는 경우에 정답 리턴


💚 제출 코드

import java.util.*;

class Solution {
    
    public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];
        int sum = brown + yellow;
        //약수 구하기  
        for(int i=3; i<= sum; i++){
            int j = sum / i; //sum 을 구성할 수 있는 약수 (i, j) 구하고
            
            if(j >= 3){
                int col = Math.max(i, j);//둘 중 큰값 가로
                int row = Math.min(i, j);//둘 중 작은 값 세로
                
                int mid = (col - 2) * (row - 2);
                
                if(mid == yellow){
                    answer[0] = col; //가로
                    answer[1] = row; //세로
                    return answer;
                }
            }
        }
        
        return answer;
    }
}
728x90