본문 바로가기
알고리즘 풀이/백준

[백준 16918] 봄버맨 (python)

by char_lie 2023. 3. 22.
반응형

https://www.acmicpc.net/problem/16918

 

16918번: 봄버맨

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

www.acmicpc.net

봄버맨 문제

조건에 맞게 폭탄을 설치하고, 시간이 지나면 터지게 만드는 문제

조건과 구조만 잘 생각하면 풀어 낼 수 있었다.

내가 푼 정답코드

def bomb_position(): # 폭탄 위치 찾기
    for i in range(R):
        for j in range(C):
            if bomb[i][j] == 'O':
                temp.append([i,j])

def bomb_BBAM(): #터뜨리기
    while temp:
        y, x= temp.popleft()
        bomb[y][x] = '.'
        for dy, dx in splash:
            ny, nx = y + dy, x + dx
            if 0 <= ny < R and 0 <= nx < C:
                bomb[ny][nx] = '.'
                
def bomb_set(): #폭탄 두기
    for i in range(R):
        for j in range(C):
            if bomb[i][j] == '.':
                bomb[i][j] = 'O'
import sys
from collections import deque
R, C, N = map(int, sys.stdin.readline().split())
bomb = [list(sys.stdin.readline().strip()) for _ in range(R)]
splash = [[1,0],[-1,0],[0,1],[0,-1]]
if N%2 != 0 :
    N -= 1
    while N > 0 : # 남은 시간 동안
        temp = deque() # 초기화
        bomb_position() # 폭탄 위치 찾고
        bomb_set() # 폭탄 두고
        #짝수 초에는 모든 맵에 폭탄이 무조건 배치된 상태 (무시해도됨)
        N -= 1 # 어차피 폭탄 두고 1초 동안은 안터지니 1초 무시 
        if N == 0: #만약 시간이 N초면
            break # 끝
        bomb_BBAM() #터뜨려! 
        N -= 1 #시간 1초 지나
    for i in bomb:
        print(*i,sep='')
else :
    bomb = [['O']*C for _ in range(R)]
    for i in bomb:
        print(*i,sep='')

📌 문제 접근 포인트

1. 폭탄의 조건을 생각해보자 → 첫 1초는 아무 일이 일어나지 않으니 N에서 1을 빼주고 시작하자.
2. 폭탄이 설치되지 않은 칸에 전부 설치한다 → 기존 폭탄 위치를 찾아 저장해줄 필요가 있다.
3. 폭탄위치를 저장했다면, 이젠 모든 위치에 폭탄을 설치한다.
4. 3초 후 폭탄이 터지되, 연쇄반응은 없다.
5. 그렇다면 1번 설치 후엔 무조건 다음엔 모든 맵에 폭탄이 존재한다 → 즉, N이 짝수이면 무조건 폭탄이 전부 존재하니, 연산 시간을 줄여주기 위해서 N이 짝수, 홀수일 때를 나눠주자.
6. 1,2,3,4,5를 그대로 구현해서 조합해주면 풀 수 있다.
반응형

댓글