https://www.acmicpc.net/problem/16918
간만에 시뮬 문제 푸니.. 신난다ㅎㅎㅎㅎ..😇 (아님)
시간의 흐름에 따라 폭발물을 폭발시키기 때문에 각 칸을 초로 관리했다. 폭발하면 0이 되고, 시간이 1초 지날 때마다 각 칸의 수를 늘렸다.
if t % 2 == 1:
boom() # 폭발
이렇게 처리한 이유는 시간이 흐름 == 폭발물 설치(0->1
인 경우)기 때문이고, 폭발물 설치하는 사이클과 폭발의 사이클을 분리하기 위해서다.
r, c, n = map(int, input().split())
board = [list(input()) for _ in range(r)]
# 초기화
for i in range(r):
for j in range(c):
if board[i][j] == 'O':
board[i][j] = 1
elif board[i][j] == '.':
board[i][j] = 0
def tick(): # 1초씩 흐르기 (+폭발물 설치)
for i in range(r):
for j in range(c):
board[i][j] += 1
def boom(): # 폭발시키기
to_explode = set()
for i in range(r):
for j in range(c):
if board[i][j] == 3:
to_explode.add((i, j))
for di, dj in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
if 0 <= i + di < r and 0 <= j + dj < c:
to_explode.add((i + di, j + dj))
for x, y in to_explode:
board[x][y] = 0
# simulate
t = 1
while t < n:
tick() # 1초++
t += 1
if t % 2 == 1:
boom() # 폭발
# print board
res_board = []
for i in range(r):
row = ['.'] * c
for j in range(c):
if board[i][j] > 0:
row[j] = 'O'
print(''.join(row))