Algorithm/Implementation

[백준 16918번] 봄버맨

킹우현 2024. 1. 4. 21:18

 

16918번: 봄버맨

첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.

www.acmicpc.net

r,c,n = map(int,input().split())

area = [list(input()) for _ in range(r)]

flag = False

dx = [-1,1,0,0]
dy = [0,0,-1,1]

for i in range(r): # 초기 상태에서 1초 지난 상태로 초기화
    for j in range(c):
        if area[i][j] == "O":
            area[i][j] = 2

for _ in range(n-1): # n-1초 간 3 ~ 4과정 반복
    for i in range(r): # 폭탄이 설치되어 있지 않은 모든 칸에 폭탄을 설치
        for j in range(c):
            if area[i][j] == ".": # 빈칸에는 폭탄설치
                area[i][j] = 3
            else: # 폭탄은 1초 시간 경과
                area[i][j] -= 1

    temp_area = [item[:] for item in area] # 값 덮어쓰기를 방지하기 위해 별도의 2차원 배열 사용
    
    for i in range(r): # 3초 전에 설치된 폭탄이 모두 폭발
        for j in range(c):
            if area[i][j] != "." and area[i][j] <= 0:
                temp_area[i][j] = "."
                for k in range(4):
                    temp_x = i + dx[k]
                    temp_y = j + dy[k]
                        
                    if 0 <= temp_x < r and 0 <= temp_y < c:
                        temp_area[temp_x][temp_y] = "."
    area = temp_area

for i in range(r):
    for j in range(c):
        if area[i][j] != ".":
            area[i][j] = "O"

for i in range(r):
    print("".join(area[i]))

 

이번 문제는 r x c 크기의 직사각형 격자판에서 매 초마다 빈칸에는 폭탄을 설치하고, 폭탄이 3초가 경과한 경우에는 상하좌우를 포함하여 폭발하도록 하였을 때, N초가 지난 후의 격차판 상태를 구하는 문제이다.

 

먼저 폭탄의 시간을 카운팅하기 위해 폭탄을 o가 아니라 폭발까지 남은 시간으로 저장해주고, n-1번 만큼 3-4번 과정을 반복해주었다.

 

중간에 문제 조건과 값을 잘못 이해하여 시간을 많이 잡아먹게 되었는데, 앞으로 문제를 풀이할 때는 문제가 길더라도 정확하게 파악한 뒤에 풀도록 해야겠다.