알고리즘

[PCCP 기출 10번] 공원

moongi 2025. 6. 2. 15:49
728x90
반응형

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 유형

  • 구현

 

문제 난이도

  • Lev1

 

문제 분석

해당 문제는 2차원 배열로 이루어진 공원에서 빈 공간에 정사각형 모양의 돗자리를 깐다고 했을 때 깔 수 있는 최대의 한 변의 길이를 구하는 문제이다.

문제에서 park의 길이 <= 50, 돗자리의 길이 <= 10이기 때문에, 완전 탐색을 진행해도 시간 초과 없이 해결할 수 있는 문제였다.
만약 해당 문제를 조금 더 복잡하게 풀고 싶다면, 슬라이딩 윈도우를 사용하면 시간 복잡도와 메모리 효율을 높일 수 있을 것이다.

그러나, 굳이 쉬운 문제를 어렵게 풀 이유는 없을 것 같다.

전체 코드에 주석으로 설명을 추가하였다.

 

전체 코드

import java.io.*;
import java.util.*;

class Solution {
    public int solution(int[] mats, String[][] park) {
        int answer = -1;
        
        // 돗자리의 크기를 오름차순 정렬
        Arrays.sort(mats);
        
        // 돗자리의 크기가 큰 순서대로 비교를 시작한다.
        for(int k = mats.length-1; k >= 0; k--) {
        	// 현재 돗자리의 크기
            int n = mats[k];
            
            // 공원을 순회한다.
            for(int i = 0; i <= park.length - n; i++) {
               for(int j = 0; j <= park[0].length - n; j++) {
                   
                   // 돗자리 크기만큼 순회를 돌았을 때, 모두 빈 공간인 경우, false
                   boolean flag = false;

                   label: for(int l = i; l < i + n; l++) {
                       for(int m = j; m < j + n; m++) {
                       	// 빈 공간이 아니라면
                           if (!park[l][m].equals("-1")) {

                               flag = true;
                               break label;
                            }
                       }
                   }
                   
                   if(!flag) {
                       answer = n;
                       return answer;
                   }
               }
            }
            
        }
        
        return answer;
    }
}
728x90
반응형