본문 바로가기
코딩테스트/programming_JAVA

[Java] 프로그래머스_42842 : 카펫

by prometedor 2023. 11. 20.

완전탐색

카펫 - Level 2

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

 

프로그래머스

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

programmers.co.kr

 

 

 

풀이1

class Solution {
    public int[] solution(int brown, int yellow) {
        int[] ret = new int[2];
        
        for (int x = 3; x <= 5000; x++) {
            int y = (brown + yellow) / x;
            
            if ((x - 2) * (y - 2) == yellow) {
                ret[0] = y;
                ret[1] = x;
                break;
            }
        }
        
        return ret;
    }
}

 

ㄴ 첫 번재 코드는 가로를 기준으로만 하여 확인하도록 코드를 작성하였다.

 

 

풀이2

public class Solution {
    public int[] solution(int brown, int yellow) {
        for (int x = 3; x <= 5000; x++) {
            for (int y = 3; y <= x; y++) {
                int boundary = (x + y - 2) * 2;
                int center = x * y - boundary;

                if (brown == boundary && yellow == center) {
                    return new int[] {x, y};
                }
            }
        }

        return null;
    }
}

 

ㄴ 두 번째 코드는 모든 가능한 조합을 확인하도록 코드를 작성하였다.

ㄴ yellow 는 1이상이라고 명시되어 있으므로 가로 세로의 길이가 모두 최소 3 이상이라는 것을 의미한다.

ㄴ brown 이 8 이상, 5000 이하라는 조건이 있다.

     => x (가로 길이) 조건에 주어진 5000은 임의로 선택한 숫자로, 이는 가능한 범위 내에서 충분한 크기로 선택한 것이다.

     => brown 이 8 이상이고 yellow 는 1이상이므로 가로와 세로의 길이의 최소값은 3이다.

ㄴ 가로 길이가 세로 길이보다 크거나 같다는 조건을 이용하여 세로 길이는 3 이상, 가로 길이 이하라는 범위를 찾아냈다.

ㄴ brown 으로 표시된 격자는 x * 2 + (y - 2) * 2 개이다. => (x + y - 2) * 2 개 : boundary

ㄴ yellow 로 표시된 격자는 x * y - (x + y -2) * 2 개이다. => center = x * y - boundary

ㄴ 첫 번째 코드에서는 int[] ret = new int[2]; 를 코드 첫 번째에 선언한 후 ret[0] = y; ret[1] = x; 를 설정해주도록 하여 ret 을 return 하도록 작성했는데, 두 번째 코드에서는 new int[] {x, y} 를 바로 return 하도록 코드를 작성했다.