반응형
https://www.acmicpc.net/problem/16918
봄버맨 문제
조건에 맞게 폭탄을 설치하고, 시간이 지나면 터지게 만드는 문제
조건과 구조만 잘 생각하면 풀어 낼 수 있었다.
내가 푼 정답코드
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를 그대로 구현해서 조합해주면 풀 수 있다.
반응형
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 16967] 배열 복원하기 (python) (0) | 2023.03.23 |
---|---|
[백준 16139] 인간-컴퓨터 상호작용 (python) (0) | 2023.03.23 |
[백준 17413] 단어 뒤집기 2 (python) (0) | 2023.03.20 |
[백준 1748] 수 이어 쓰기1 (python) (0) | 2023.03.19 |
[백준 1051] 숫자 정사각형 (python) (0) | 2023.03.18 |
댓글