https://www.acmicpc.net/problem/16918
n=0일 때: 폭탄 설치
n=1일 때: 그대로
n=2일 때~: 나머지 모든 칸에 폭탄 설치 -> 폭발 반복
r*c 크기의 bombs 배열을 모두 0으로 초기화하고,
초기 상태 배열을 입력받으면서 'O'인 부분은 2로 바꿔준다. (0초 - 1초 상태)
i=2부터 n+1까지 for문을 돌려주면서
1. bombs 순회하면서 값을 하나씩 감소시키고,
2. i가 짝수일 때에는 모든 칸에 폭탄 설치 -> 0인 부분을 3으로 바꿔준다. (3초 후에 폭탄을 폭발시킬 것이기 때문)
i가 홀수일 때에는 폭탄을 폭발시킨다. -> 0인 부분을 상하좌우 탐색하면서 폭발시킨다.
마지막에 0인 부분은 '.'으로 바꿔서, 아닌 부분은 'O'로 바꿔서 출력해주면 된다.
import copy
def explode(x, y, r, c):
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
for i in range(4):
mx = x + dx[i]
my = y + dy[i]
if mx < 0 or mx >= r or my < 0 or my >= c:
continue
temp[mx][my] = 0
r, c, n = map(int, input().split())
bombs = [[0] * c for _ in range(r)]
for i in range(r):
temp = list(input())
for j in range(c):
if temp[j] == 'O':
bombs[i][j] = 2
for i in range(2, n+1):
for x in range(r): # 값 하나씩 감소
for y in range(c):
if bombs[x][y] != 0:
bombs[x][y] -= 1
if i % 2 == 0: # 모든 칸에 폭탄 설치
for x in range(r):
for y in range(c):
if bombs[x][y] == 0:
bombs[x][y] = 3
else: # 3초가 지난 폭탄 폭발
temp = copy.deepcopy(bombs)
for x in range(r):
for y in range(c):
if bombs[x][y] == 0:
explode(x, y, r, c)
bombs = temp[:]
for i in range(r):
for j in range(c):
if bombs[i][j] == 0:
bombs[i][j] = '.'
else:
bombs[i][j] = 'O'
print(bombs[i][j], end='')
print()
'알고리즘 > 백준' 카테고리의 다른 글
백준 21921: 블로그 (Python) (0) | 2023.06.15 |
---|---|
백준 12933: 오리 (Python) (0) | 2023.04.14 |
백준 1766: 문제집 (Python) (0) | 2022.08.05 |
백준 2252: 줄 세우기 (Python) (0) | 2022.08.05 |
백준 2887: 행성 터널 (Python) (0) | 2022.08.04 |