[백준] 16918. 봄버맨 (Python)

yuuforest·2023년 9월 6일

그래프 탐색

목록 보기
9/14
post-thumbnail

백준 문제 풀이 - 그래프 탐색

📰 문제


문제 확인 🏃


💡 입출력 예제


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. 처음 1초 동안은 아무것도 진행되지 않기 때문에 N=1일때는 처음 상태와 동일

  2. N이 2의 배수 시간일 경우 폭탄을 채워넣기 때문에 항상 all 폭탄 상태

  3. 4로 나누었을때 나머지가 3인 경우 규칙 2번에서 규칙 1번에 존재하던 폭탄이 터진 상태

  4. 4로 나누었을때 나머지가 1인 경우 규칙 2번에서 규칙 3번에 존재하던 폭탄이 터진 상태

풀어서 다행이여 😁

profile
🐥 Backend Developer 🐥

0개의 댓글