2차원 배열회전 문제. 이문제는 따로 notebook배열을 늘려줄 필요가 없어서 그나마 설계하기 쉬웠다.
저번 문제보다 훨씬..
90도 회전 외워두니까 진짜 넘 편한듯.
[k[::-1] for k in zip(*list)]
import sys
input = sys.stdin.readline
# 검사하기
def is_matching(x, y, sticker, R, C):
for i in range(x, x+R):
for j in range(y, y+C):
if notebook[i][j] and sticker[i-x][j-y]:
return False
for i in range(x, x+R):
for j in range(y, y+C):
if sticker[i-x][j-y]:
notebook[i][j]=1
return True
# 검사 시작지점 찾기.
def find_sticker_start(sticker, R, C):
for i in range(N-R+1):
for j in range(M-C+1):
if is_matching(i, j, sticker, R, C):
return True
return False
def turn_sticker(sticker):
sticker = [k[::-1] for k in zip(*sticker)]
return sticker
N, M, K = map(int, input().split())
notebook = [[0 for _ in range(M)] for _ in range(N)]
for _ in range(K):
R, C = map(int, input().split())
sticker = [list(map(int, input().split())) for _ in range(R)]
# 스티커를 노트북에 붙일수 있는가 검사.
for _ in range(4):
if find_sticker_start(sticker, R, C):
break # 가능? 붙히고 회전 종료.
else: # 불가능? 90도 회전
sticker = turn_sticker(sticker)
R, C = C, R
# 모든 스티커 부착이 끝나면 칸수 세어보기.
sum_sticker = 0
for i in range(N):
sum_sticker += sum(notebook[i])
print(sum_sticker)
'practivceAlgorithm > 백준' 카테고리의 다른 글
[백준][Python] 11265 끝나지 않는 파티 (0) | 2021.08.12 |
---|---|
[백준][Python] 9372 상근이의 여행 (0) | 2021.08.12 |
[백준][Python] 20364 부동산 다툼. (1) | 2021.08.11 |
[백준][Python] 2096 내려가기 (0) | 2021.08.11 |
[백준][Python] 15961 회전초밥 : 슬라이딩 윈도우 연습 (0) | 2021.08.11 |