Algorithm/백준_생각정리
백준_16918_봄버맨 (python)
코친남
2023. 7. 30. 14:30
★ 접근
r,c,n의 크기가 최대 200이기 때문에 bfs로 풀까 생각했지만 폭탄이 동시에 깔리고 동시에 터지는 문제는 bfs로는 풀기 힘든 상황들이 자주 발생해서 쌩 구현을 해도 된다고 생각하고 접근
★ 풀이
n이 1초 => 초기 상태 출력
n이 짝수 => 모든 칸이 폭탄
그 외 = > 0초 폭탄, 1초 폭탄, 2초 폭탄을 나누어서
2초를 터트리고 0초를 1초로 만들고 => 다음 1초동안 모든칸 포탄 채우고 1초 => 2초 폭탄 0초 폭탄 생성
위 구문을 n-2초 동안 반복
★ 코드
import sys
input = sys.stdin.readline
r,c,n, = map(int,input().split())
graph = [list(input().rstrip()) for _ in range(r)]
isgraph = set([(i,j) for i in range(r) for j in range(c)])
if n == 1:
for lis in graph:
print(''.join(lis))
else:
if n % 2 == 0:
for i in range(r):
print('O'*c)
else:
zero = set()
one = set()
two = set()
temp = set()
dx = [-1,1,0,0]
dy = [0,0,-1,1]
for i in range(r):
for j in range(c):
if graph[i][j] == '.':
zero.add((i,j))
else:
two.add((i,j))
for i in range(n-2): # n이 2초면 아에 이 반복에 안 들어갈 것이고 n이 3초면 한 번 반복 ok
if i % 2 == 0:
temp = set()
for x,y in two:
temp.add((x,y))
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if 0 <= nx < r and 0 <= ny < c:
temp.add((nx,ny))
zero = zero - temp # 이러면 zero에 있던 폭탄들중에서도 해당되는 것들은 터졌다.
one = zero # 이제 0초가 1초가 된다..
else:
two = one
zero = isgraph - one # 전체에서 2초를 뺀것이 이제 0초가 된다.
for i in range(r):
for j in range(c):
if (i,j) in one:
print("O", end='')
else:
print(".", end='')
print()
★ 회고
폭탄이 터지고 생기고를 반복하면서 격자 폭탄이 생기는 모양이 계속 바뀐다고 생각을 했다. 그래서 시뮬레이션 기법처럼 풀었다. 다 풀고 시간이 오래 걸리길래 문제를 다시 읽어보면서 힌트를 발견했고 힌트에서 격자의 모양이 반복되는 것을 알 수 있었다. 쉬운 문제들은 힌트를 잘 안 보고 푸는 풀어보자는 마인드였는데 쉬운 문제여도 힌트를 잘 봐야겠다.