[파이썬] 백준 16918번 : 봄버맨

[문제]

문제 : 백준 16918번_봄버맨

솔직히 어려웠다.. 시뮬레이션은 처음이였음

참고로 봄버맨 2 문제도 있는데 무려 골드 문제

 

 

 

[의사(구현) 코드]

[입력]
1. R, C, N : 격자판의 행, 열, 시간
2. grid : R줄에 걸쳐 초기 격자 상태
- 각 칸은 '.' 또는 'O' (빈칸 또는 폭탄)

[구현]
3. 만약 N이 1이면
- 아무 일도 없으니까 grid 그대로 반환

4. 만약 N이 짝수이면 (2, 4, 6,...)
- 격자판 전체를 폭탄('O')으로 채운 걸 반환

5. 그렇지 않으면 (N이 홀수이고 1이 아님이면)
- 두 번 폭발을 시뮬해야 함

5-1. first : 초기 grid에서 폭탄을 터뜨린 결과 (3초 상태)
5-2. second : first에서 다시 폭탄을 터뜨린 결과 (5초 상태)

5-3. N % 4 == 3이면 : first 반환 (3초, 7초, 11초 등)
5-4. N % 4 == 1이면 : second 반환 (5초, 9초, 13초 등)

폭탄이 터지는 함수 bomb(grid)
- 새로 만든 격자를 전부 'O'로 채움
- 원래 grid에 폭탄이 있는 위치와 그 상하좌우를 모두 '.'로 바꿈


[출력]
6. 반환된 격자(result)를 한 줄씩 출력
- 리스트를 문자열로 합쳐서 print()

 

 

 

[코드]

import sys
input = sys.stdin.readline

# 폭탄 터뜨리는 함수
def bomb(grid, R, C):
    result = [['O'] * C for _ in range(R)]  # 일단 전부 폭탄으로 가득 채우자
    for i in range(R):
        for j in range(C):
            if grid[i][j] == 'O':   # 이전 상태에 폭탄이 있다면
                result[i][j] = '.'  # 자기 자신은 빈 칸
                for dx, dy in [(-1,0), (1,0), (0,-1), (0,1)]:   # 상하좌우
                    ni, nj = i + dx, j + dy
                    if 0 <= ni < R and 0 <= nj < C:
                        result[ni][nj] = '.'    # 인접한 칸도 펑
    return result

# 문제 전체(입력)
def bomberman():
    R, C, N = map(int, input().split()) # 행, 열, 시간 입력
    grid = [list(input().strip()) for _ in range(R)]    # 초기 상태

    if N == 1:
        return grid # 아무 일 없음. 그대로임
    elif N % 2 == 0:
        return [['O'] * C for _ in range(R)]    # 짝수 초는 전부 폭탄임
    else:
        first = bomb(grid, R, C)       # 3초 때 폭발
        second = bomb(first, R, C)     # 5초 때 폭발
        return first if N % 4 == 3 else second  # 3, 7, 11초... : 첫 폭발과 같은 결과
                                                # 5, 9, 13초... : 두 번째 폭발과 같은 결과

# 출력
result = bomberman()
for row in result:
    print(''.join(row)) # 리스트를 문자열로 합쳐서 출력

 

 

 

[제출 결과]