문제: https://www.acmicpc.net/problem/18808
18808번: 스티커 붙이기
혜윤이는 최근에 다양한 대회를 참여하면서 노트북에 붙일 수 있는 스티커들을 많이 받았다. 스티커는 아래와 같이 사각 모눈종이 위에 인쇄되어 있으며, 스티커의 각 칸은 상하좌우로 모두 연
www.acmicpc.net
구현 문제였는데, 내가 푼 방법은 다음과 같다.
1. notebook과 동일한 temp_notebook을 생성 후, 두 값이 같을 동안 while 문을 돌린다.
2. while 문 내에서 노트북의 왼쪽 위 (0, 0)부터 오른쪽아래 (n, m)까지 돌며 스티커를 붙일 수 있는지 확인한다.
2-1. 만약 노트북에 스티커를 붙일 수 있으면 while문을 빠져나온다.
2-2. 노트북에 스티커를 붙이지 못하는 경우, 스티커를 90도 회전시킨다.
3. 위 과정을 스티커가 0, 90, 180, 270도 만큼 도는 동안 총 4번 반복
n, m, k = map(int, input().split())
notebook = [[0]*m for _ in range(n)]
# 스티커 붙여보기
def put_sticker(sticker, x, y, notebook):
temp_notebook = []
for i in range(n):
temp = []
for j in range(m):
temp.append(notebook[i][j])
temp_notebook.append(temp)
for s_x in range(len(sticker)):
for s_y in range(len(sticker[0])):
if sticker[s_x][s_y] == 1:
if notebook[x+s_x][y+s_y] == 0:
temp_notebook[x+s_x][y+s_y] = 1
else:
return notebook
return temp_notebook
# 스티커 시계방향으로 90도 돌리기
def rotate_90(sticker):
return list(map(list, zip(*sticker[::-1])))
for _ in range(k):
row, col = map(int, input().split())
sticker = []
for _ in range(row):
sticker.append(list(map(int, input().split())))
# temp_notebook 변수에 기존 notebook 복사하기 (deepcopy)
temp_notebook = []
for i in range(n):
temp = []
for j in range(m):
temp.append(notebook[i][j])
temp_notebook.append(temp)
rotate_num = 0
while temp_notebook == notebook:
if rotate_num == 4: # 총 4번 반복
break
# 노트북의 왼쪽 위부터 오른쪽 아래까지 돌기
for x in range(n):
for y in range(m):
if x+(len(sticker)-1) < n and y+(len(sticker[0])-1) < m: # 칸이 맞을 때
temp_notebook = put_sticker(sticker, x, y, notebook)
if temp_notebook != notebook:
break
if temp_notebook != notebook:
break
sticker = rotate_90(sticker) # 노트북에 스티커를 붙이지 못한 경우, 90도 돌리기
rotate_num += 1
notebook = temp_notebook
# print(notebook)
answer = 0
for i in range(n):
for j in range(m):
if notebook[i][j] == 1:
answer += 1
print(answer)
'코딩테스트' 카테고리의 다른 글
[Python] 백준 2146번 - 다리 만들기 (bfs, dfs 풀이) (0) | 2023.08.23 |
---|---|
[Python] 백준 16234번 - 인구 이동 (0) | 2023.08.07 |
[Python] 백준 14891번 - 톱니바퀴 (재귀) (0) | 2023.08.02 |
[Python] 백준 14891번 - 톱니바퀴 (0) | 2023.08.01 |
[Python] 백준 15686번 - 치킨 배달 (dfs 백트래킹) (0) | 2023.07.18 |