[Java] 카펫

allzeroyou·2025년 1월 22일
0

Java-Algorithm

목록 보기
11/26
post-thumbnail

https://youtu.be/dklNjszX82s?si=0asCkZrNHFyiyTxF

수민(SUMIN)의 설탕분수 (Prod.Pomrad)을 들으며 풀다.

문제 설명

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

테두리: 갈색, 중앙: 노란색인 격자 모양 카펫.
갈색, 노란색의 격자 개수가 주어질 때, 카펫 가로, 세로 크기 return.

풀이

입출력 예

brownyellowreturn
102[4, 3]
81[3, 3]
2424[8, 6]

입출력 예를 보면, 일정한 패턴을 구할 수 있다.
카펫 가로, 세로 크기에서 -2 한 값의 곱한 값(넓이)는 노란색의 격자 개수이다.

따라서 brown 즉, 갈색 격자 수의 절반값부터 줄여가면서, 완전탐색을 진행한다.

가령, 입출력 예 1의 경우를 보면, brown: 10의 절반인 5,5부터 줄여가면서 가로-2, 세로-2 한 값의 곱한 값이 노란색의 격자 개수와 일치하는 값일 반환한다.

또한, 구한값이 (가로*2)+(세로-2)*2 가 brown과 일치하는지 확인한다.
세로-2 하는 이유는, 가로에서 이미 더했기 때문에 중복을 제거해준다.

가령, #입출력3을 보게되면 12부터 줄여나간다면 해당 조건이 없다면 [10, 5]가 return되게 된다. 하지만 10*2 + (5-2)*2 = 16이므로 정답이 아니다. 따라서 건너뛰고 [8,6]인 (8 * 2)+(6-2)*2= 24이 return 되도록!

정답코드

class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];
        
        int mid = brown/2;
        
        int flag = 0;
        
        for(int i=mid; i>0; i--){
         
            for(int j=mid-1; j>0; j--){
            
                if((i-2)*(j-2)==yellow && (i*2)+(j-2)*2==brown ) {
                    answer[0]=i;
                    answer[1]=j;
                    flag= 1;
                    break;
                }
            }
               if(flag==1){
                break;
            }
        }
        
        return answer;
    }
}
profile
모든 건 zero 부터, 차근차근 헛둘헛둘

0개의 댓글