728x90
문제 설명
해당 스티커를 붙일 수 있는지 확인한다. arr은 해당 스티커를 의미하고 plist에 스티커의 좌표를 넣어준다.
flag는 스티커를 붙일 수 있는지 판별하는 bool형 변수다. 이중 for문을 통해 처음부터 끝의 좌표들을 검사해 스티커를 붙일 수 있는지 확인한다. 확인해야 하는 경우의 수는 총 세 가지다. 스티커를 붙일 때 가로측 범위를 벗어나는지, 세로측 범위를 벗어나는지, 이미 스티커가 붙여있는지를 확인하면 된다. 만약 붙일 수 없는 경우 스티커를 90도 회전시키고 plist를 초기화한다.
해당 내용을 3번 더 반복한다.
전체 코드
laptop = []
M = 0
N = 0
def turn(arr):
n = len(arr)
m = len(arr[0])
tmp = []
for j in range(m):
tmp2 = []
for i in reversed(range(n)):
tmp2.append(arr[i][j])
tmp.append(tmp2)
return tmp
def func(arr):
global laptop
global N
global M
plist = []
for i in range(len(arr)):
for j in range(len(arr[i])):
if arr[i][j] == 1:
plist.append([i,j])
flag = True
for i in range(N):
for j in range(M):
for k in range(len(plist)):
if plist[k][0] + i >= N:
flag = False
break
if plist[k][1] + j >= M:
flag = False
break
if laptop[i+plist[k][0]][j+plist[k][1]] == 1:
flag = False
break
flag = True
if flag:
for k in range(len(plist)):
laptop[i+plist[k][0]][j+plist[k][1]] = 1
return
arr = turn(arr)
plist.clear()
for i in range(len(arr)):
for j in range(len(arr[i])):
if arr[i][j] == 1:
plist.append([i,j])
for i in range(N):
for j in range(M):
copy_plist = [item[:] for item in plist]
for k in range(len(copy_plist)):
if copy_plist[k][0] + i >= N:
flag = False
break
if copy_plist[k][1] + j >= M:
flag = False
break
if laptop[i+copy_plist[k][0]][j+copy_plist[k][1]] == 1:
flag = False
break
flag = True
if flag:
for k in range(len(copy_plist)):
laptop[i+copy_plist[k][0]][j+copy_plist[k][1]] = 1
return
arr = turn(arr)
plist.clear()
for i in range(len(arr)):
for j in range(len(arr[i])):
if arr[i][j] == 1:
plist.append([i, j])
for i in range(N):
for j in range(M):
copy_plist = [item[:] for item in plist]
for k in range(len(copy_plist)):
if copy_plist[k][0] + i >= N:
flag = False
break
if copy_plist[k][1] + j >= M:
flag = False
break
if laptop[i + copy_plist[k][0]][j + copy_plist[k][1]] == 1:
flag = False
break
flag = True
if flag:
for k in range(len(copy_plist)):
laptop[i + copy_plist[k][0]][j + copy_plist[k][1]] = 1
return
arr = turn(arr)
plist.clear()
for i in range(len(arr)):
for j in range(len(arr[i])):
if arr[i][j] == 1:
plist.append([i, j])
for i in range(N):
for j in range(M):
copy_plist = [item[:] for item in plist]
for k in range(len(copy_plist)):
if copy_plist[k][0] + i >= N:
flag = False
break
if copy_plist[k][1] + j >= M:
flag = False
break
if laptop[i + copy_plist[k][0]][j + copy_plist[k][1]] == 1:
flag = False
break
flag = True
if flag:
for k in range(len(copy_plist)):
laptop[i + copy_plist[k][0]][j + copy_plist[k][1]] = 1
return
return
def main():
global laptop
global M,N
N,M,K = map(int,input().split())
laptop = [[0]*M for _ in range(N)]
while K:
K -= 1
paper = []
n, m = map(int,input().split())
for i in range(n):
paper.append(list(map(int,input().split())))
func(paper)
count = 0
for i in range(N):
for j in range(M):
if laptop[i][j]:
count += 1
print(count)
return
if __name__ == "__main__":
main()
728x90
반응형
'코딩테스트 > 파이썬' 카테고리의 다른 글
백준 3190번 뱀 (0) | 2021.02.11 |
---|---|
백준 11559번 Puyo Puyo (0) | 2021.02.09 |
백준 12100번 2048(Easy) (0) | 2021.02.07 |
백준 15683번 감시 (0) | 2021.02.06 |
백준 1799번 비숍 (0) | 2021.02.04 |