[Silver I] Title: 봄버맨, Time: 4156 ms, Memory: 36672 KB -BaekjoonHub

This commit is contained in:
SSUM
2026-02-09 20:51:32 +09:00
parent 75e364c230
commit a9ce5948b0
2 changed files with 107 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
# [Silver I] 봄버맨 - 16918
[문제 링크](https://www.acmicpc.net/problem/16918)
### 성능 요약
메모리: 36672 KB, 시간: 4156 ms
### 분류
구현, 시뮬레이션
### 제출 일자
2026년 2월 9일 20:49:58
### 문제 설명
<p><a href="https://en.wikipedia.org/wiki/Bomberman">봄버맨</a>은 크기가 R×C인 직사각형 격자판 위에서 살고 있다. 격자의 각 칸은 비어있거나 폭탄이 들어있다.</p>
<p>폭탄이 있는 칸은 3초가 지난 후에 폭발하고, 폭탄이 폭발한 이후에는 폭탄이 있던 칸이 파괴되어 빈 칸이 되며, 인접한 네 칸도 함께 파괴된다. 즉, 폭탄이 있던 칸이 (i, j)인 경우에 (i+1, j), (i-1, j), (i, j+1), (i, j-1)도 함께 파괴된다. 만약, 폭탄이 폭발했을 때, 인접한 칸에 폭탄이 있는 경우에는 인접한 폭탄은 폭발 없이 파괴된다. 따라서, 연쇄 반응은 없다.</p>
<p>봄버맨은 폭탄에 면역력을 가지고 있어서, 격자판의 모든 칸을 자유롭게 이동할 수 있다. 봄버맨은 다음과 같이 행동한다.</p>
<ul>
<li>가장 처음에 봄버맨은 일부 칸에 폭탄을 설치해 놓는다. 모든 폭탄이 설치된 시간은 같다.</li>
<li>다음 1초 동안 봄버맨은 아무것도 하지 않는다.</li>
<li>다음 1초 동안 폭탄이 설치되어 있지 않은 모든 칸에 폭탄을 설치한다. 즉, 모든 칸은 폭탄을 가지고 있게 된다. 폭탄은 모두 동시에 설치했다고 가정한다.</li>
<li>1초가 지난 후에 3초 전에 설치된 폭탄이 모두 폭발한다.</li>
<li>3과 4를 반복한다.</li>
</ul>
<p>폭탄을 설치해놓은 초기 상태가 주어졌을 때, N초가 흐른 후의 격자판 상태를 구하려고 한다.</p>
<p>예를 들어, 초기 상태가 아래와 같은 경우를 보자.</p>
<pre>...
.O.
...</pre>
<p>1초가 지난 후에는 아무 일도 벌어지지 않기 때문에, 위와 같다고 볼 수 있다. 1초가 더 흐른 후에 격자판의 상태는 아래와 같아진다.</p>
<pre>OOO
OOO
OOO</pre>
<p>1초가 지난 후엔 가운데에 있는 폭탄이 폭발해 가운데 칸과 인접한 네 칸이 빈 칸이 된다.</p>
<pre>O.O
...
O.O
</pre>
### 입력
<p>첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '<code>.</code>'로, 폭탄은 '<code>O</code>'로 주어진다.</p>
### 출력
<p>총 R개의 줄에 N초가 지난 후의 격자판 상태를 출력한다.</p>

View File

@@ -0,0 +1,46 @@
from collections import deque
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
grid = [] # 격자판
boomList = deque() # 폭탄 좌표 리스트
R, C, N = map(int, input().split())
for i in range(R): # 격자판 정보 입력
row = list(input())
for j in range(C):
if row[j] == 'O': # 처음 폭탄 좌표들 저장
boomList.append([i, j])
grid.append(row)
t = 1 # 처음 1초가 지난 후에 격자판에 아무 일도 벌어지지 않기 때문에, 초기 시간을 1로 잡아도 된다.
while t < N:
for i in range(R): # 폭탄 채워넣기
for j in range(C):
if grid[i][j] == '.':
grid[i][j] = 'O'
t += 1
if t == N:
break
while boomList: # 폭탄 터트리기
x, y = boomList.popleft()
grid[x][y] = '.'
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < R and 0 <= ny < C:
grid[nx][ny] = '.'
for i in range(R): # 폭탄 터지고 남은 폭탄들 저장
for j in range(C):
if grid[i][j] == 'O':
boomList.append([i, j])
t += 1
for g in grid:
print(''.join(g))