프로그래머스 Level 1 | PCCE 기출문제 | 공원 | Python

kimminjunnn·2025년 10월 26일

알고리즘

목록 보기
215/311

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/340198


문제 파악

지민이가 깔 수 있는 돗자리의 한 변 길이 후보들이 mats에 주어지고,
공원 배치도가 2차원 리스트 park로 주어진다.

park[r][c]가 "-1"이면 빈 칸 → 돗자리 깔 수 있음

그 외(알파벳 등)는 사람/장애물 → 깔 수 없음

mats에 있는 값 중 가장 큰 k가 실제로 깔 수 있으면 그 k를 반환,
하나도 못 깔면 -1 반환해야 한다.

직관: k×k 영역이 전부 "-1"인지를 검사하는 문제이다.
“큰 k부터” 시도해서 처음 성공하면 바로 정답

해답 및 풀이

def solution(mats, park):
    height = len(park) # 세로 길이
    width = len(park[0]) # 가로 길이 park[0]이 아니어도 됨
    
    mats.sort(reverse=True) # 돗자리 큰 것 부터

    for size in mats:
        # 범위 넘어가면 애초에 불가
        if size > height or size > width:
            continue

        for r in range(height - size + 1): # 0부터 height - size 까지. (최소 height-size 는 필요하기 떄문)
            for c in range(width - size + 1): # 0부터 width - size 까지. (마찬가지로 최소 width - size 는 필요하기 떄문)
                # size x k 전체가 "-1" 인지 검사
                ok = True
                for i in range(size):
                    # 행 단위 슬라이스로 빠르게 비교
                    if park[r+i][c : c + size] != ["-1"] * size:
                        ok = False
                        break
                if ok:
                    return size
    return -1 

if park[r + i][c : c + size] != ["-1"] * size:
이 부분이 핵심이다.

park[r+i]는 현재 검사중인 row,
[c: c+size] : 그 row의 column 'c'부터 'c+size-1' 까지의 구간

즉 가로로 길게 size의 크기만큼 한줄을 슬라이싱한다.
그 값들이 다 -1*size개 가 있으면
그리고 이는 range(size) 만큼 또 반복하니 size 크기만큼의 세로의 영역
즉 r ~ r+size , c ~ c+size
이 사각형의 영역이 다 -1인지 보는 코드이다.

2차원 배열이 주어졌을 때

  • width = len(array[0])
  • height = len(array)
    가 된다는 점과,

위 방법을 통해 원하는 사각형을 슬라이싱 할 수 있다는 점을 배웠다.

profile
Frontend Engineers

0개의 댓글