https://www.acmicpc.net/problem/16918
해당 문제에서 중요하게 봐야 할 부분이다.
- 폭탄과 인접한 칸도 함께 폭발한다. (상하좌우)
- 대신, "폭탄과 인접한 칸"과 인접한 칸은 폭발하지 않는다. 연쇄작용 X
- 폭탄이 있는 칸은 3초가 지난 후에 폭발한다.
- 시간 계산
반복문을 돌리면서 시간을 계산해 주어야 하는데 이 부분에서 꽤 헤맸다.
해결 방법은 다음과 같다.
1. 처음에 주어지는 봄버맨의 폭탄 설치 위치를 저장한다.
2. 해당 폭탄을 제외한 나머지 "." 구역에 폭탄을 설치한다.
3. 1번에서 저장한 폭탄 위치를 기반으로, 폭탄 위치 및 폭탄 상하좌우 구역을 터트린다.
4. 이후부터는 2번과 3번 과정이 반복된다. 시간을 계산해 주면서 반복한다.
1. 처음에 주어지는 봄버맨의 폭탄 설치 위치를 저장한다.
2. 해당 폭탄을 제외한 나머지 "." 구역에 폭탄을 설치한다.
3. 1번에서 저장한 폭탄 위치를 기반으로, 폭탄 위치 및 폭탄 상하좌우 구역을 터트린다.
4. 시간 계산을 해주면서 반복한다.
이때 time을 0이 아닌 1로 설정해 준 이유는,
위와 같이 1초동안 아무것도 하지 않는다는 조건이 있기 때문이다. 봄버맨이 설치한 폭탄 위치를 파악하고, bomb_location 리스트에 넣어준다. 이후 폭탄이 설치되지 않은 위치에 모두 폭탄을 설치해 준 후에 1초를 더한다. 그리고 아직 시간이 남아있다면 폭탄을 터트린다.
시간을 계산하는 부분에서 헤맸던 이유는, check_bomb와 plant_bomb_all 메서드를 호출할 때마다 조건문으로 시간을 확인해 주려고 했기 때문이다. 최종 board를 출력해야 했기 때문에 어떤 메서드가 마지막에 호출되느냐에 따라 결과가 달라진다고 생각했다. 하지만 check 메서드는 폭탄의 위치만 저장할 뿐 board를 수정하지 않았고, plant 메서드는 while 문에서 시간을 미리 처리하기 때문에 if문이 필요하지 않았다.
정답 코드
import sys
input = sys.stdin.readline
def check_bomb():
for i in range(r):
for j in range(c):
if board[i][j] == "O":
bomb_location.append((i, j))
def plant_bomb_all():
for i in range(r):
for j in range(c):
if board[i][j] == ".":
board[i][j] = "O"
def explode_bomb():
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
global bomb_location
for x, y in bomb_location:
board[x][y] = "."
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < r and 0 <= ny < c:
board[nx][ny] = "."
r, c, n = map(int, input().split())
board = [list(input().strip()) for _ in range(r)]
time = 1
while time < n:
bomb_location = []
check_bomb()
plant_bomb_all()
time += 1
if time < n:
explode_bomb()
time += 1
for i in range(r):
for j in range(c):
print(board[i][j], end="")
print()
'PS > 백준' 카테고리의 다른 글
[백준] 21314번 민겸 수 (python) (0) | 2024.03.26 |
---|---|
[백준] 14719번 빗물 (python) (0) | 2024.03.22 |
[백준] 16948번 데스 나이트 (python) (0) | 2024.02.18 |
[백준] 3184번 양 (python) (1) | 2024.02.10 |
[백준] 14940번 쉬운 최단거리 (python) (0) | 2024.01.26 |