-
백준_16918_봄버맨 (python)Algorithm/백준_생각정리 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()
★ 회고
폭탄이 터지고 생기고를 반복하면서 격자 폭탄이 생기는 모양이 계속 바뀐다고 생각을 했다. 그래서 시뮬레이션 기법처럼 풀었다. 다 풀고 시간이 오래 걸리길래 문제를 다시 읽어보면서 힌트를 발견했고 힌트에서 격자의 모양이 반복되는 것을 알 수 있었다. 쉬운 문제들은 힌트를 잘 안 보고 푸는 풀어보자는 마인드였는데 쉬운 문제여도 힌트를 잘 봐야겠다.
'Algorithm > 백준_생각정리' 카테고리의 다른 글
백준_2212_센서 (python) (0) 2023.08.01 백준_15591_MooTube (python) (0) 2023.07.31 백준_28360_양동이 게임(python) (0) 2023.07.25 백준_16568_엔비스카의 영혼 (python) (0) 2023.07.16 백준_20208_진우의 민트초코우유(python) (0) 2023.07.06