16918번 봄버맨

개발새발log·2023년 5월 22일
0

백준

목록 보기
31/36

문제

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))
profile
⚠️ 주인장의 머릿속을 닮아 두서 없음 주의 ⚠️

0개의 댓글