문제 링크 : 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차원 배열이 주어졌을 때
위 방법을 통해 원하는 사각형을 슬라이싱 할 수 있다는 점을 배웠다.