백준 문제 풀이 - 그래프 탐색
문제 확인 🏃
6 7 3
.......
...O...
....O..
.......
OO.....
OO.....
>> OOO.OOO
>> OO...OO
>> OOO...O
>> ..OO.OO
>> ...OOOO
>> ...OOOO
6 7 4
.......
...O...
....O..
.......
OO.....
OO.....
>> OOOOOOO
>> OOOOOOO
>> OOOOOOO
>> OOOOOOO
>> OOOOOOO
>> OOOOOOO
6 7 5
.......
...O...
....O..
.......
OO.....
OO.....
>> .......
>> ...O...
>> ....O..
>> .......
>> OO.....
>> OO.....
→ 백준에서 힌트 확인 가능
from collections import deque
import sys
input = sys.stdin.readline
R, C, N = map(int, input().split()) # 행 R, 열 C, 시간 N
graph = [list(input().rstrip()) for _ in range(R)] # 격자판
dr = [0, 0, -1, 1]
dc = [-1, 1, 0, 0]
def solution():
if N == 1:
for g in graph:
print(''.join(g))
elif N % 2 == 0:
for _ in range(R):
print('O' * C)
else:
if N % 4 == 3:
answer = bfs(graph)
for a in answer:
print(''.join(a))
elif N % 4 == 1:
answer = bfs(bfs(graph))
for a in answer:
print(''.join(a))
def bfs(graph):
answer = [['O'] * C for _ in range(R)]
bombs = deque()
for r in range(R):
for c in range(C):
if graph[r][c] == 'O':
bombs.append((r, c))
while bombs:
nowr, nowc = bombs.popleft()
answer[nowr][nowc] = '.'
for d in range(4):
nr = nowr + dr[d]
nc = nowc + dc[d]
if nr < 0 or nc < 0 or nr >= R or nc >= C:
continue
answer[nr][nc] = '.'
return answer
solution()

처음에는 규칙없이 모든 과정을 직접 구현해야 한다 생각했는데.. 너무 헷갈려서 문제에서 설명하는 예시에 대해 그림을 그려봤다.

그림을 그렸더니, 규칙 발견 ..! 이 예시에 맞춰서 규칙을 찾아 문제를 풀었는데 틀림..😢
그래서 다른 반례를 찾아 한눈에 확인하기 위해 정리해서 그림을 그려봄
https://www.acmicpc.net/board/view/34611

내가 찾은 규칙
처음 1초 동안은 아무것도 진행되지 않기 때문에 N=1일때는 처음 상태와 동일
N이 2의 배수 시간일 경우 폭탄을 채워넣기 때문에 항상 all 폭탄 상태
4로 나누었을때 나머지가 3인 경우 규칙 2번에서 규칙 1번에 존재하던 폭탄이 터진 상태
4로 나누었을때 나머지가 1인 경우 규칙 2번에서 규칙 3번에 존재하던 폭탄이 터진 상태
풀어서 다행이여 😁