[백준 BFS] 치즈(python)

이진규·2022년 1월 22일
1

백준(PYTHON)

목록 보기
5/115

문제

https://www.acmicpc.net/problem/2636

나의 코드 (답안 참조)

"""
1. 아이디어
(0, 0) 부터 bfs를 탐색하면서 상하좌우를 확인하여 공기(0)이면 큐에 넣어 계속 탐색을 한다.
그러다 치즈(1)를 만나면 치즈가 있던 자리를 0으로 만들고 방문처리를 한다.
한번의 탐색이 끝나면 치즈가 녹은 개수를 빈 리스트에 집어넣고 개수를 반환한다.
치즈가 녹은 개수가 0이면 다 녹았다는 말이므로 탐색을 종료한다.

2. 시간복잡도
O(NM * time) 인거 같은데 가로 세로 길이가 100이고 time은 음.. 길어야 10을 안넘기지 않나? 
근데 time이 100이 된다고 해도 뭐 통과되니깐 그냥 코드 작성했다.
"""

from sys import stdin
from collections import deque
input = stdin.readline

n, m = map(int, input().split())
map = [ list(map(int, input().split())) for _ in range(n) ]
time = 0
answer = []

dx, dy = [0, 0, -1, 1], [-1, 1, 0, 0]

def bfs():
    visited = [[False] * m for _ in range(n)] # bfs 탐색할때마다 방문여부는 초기화 해줘야함
    visited[0][0] = True
    q = deque([(0, 0)])
    cnt = 0

    while q:
        px, py = q.popleft()

        for k in range(4):
            mx = px + dx[k]
            my = py + dy[k]

            if 0 <= mx < n and 0 <= my < m:
                if map[mx][my] == 0 and not visited[mx][my]:
                    visited[mx][my] = True
                    q.append((mx, my))
                elif map[mx][my] == 1: # 1인 경우는 굳이 방문여부 체크 안해도 됨.
                    map[mx][my] = 0
                    visited[mx][my] = True
                    cnt += 1

    answer.append(cnt)
    return cnt

while 1:

    time += 1
    flag = bfs()

    if flag == 0:
        break

print(time-1)
print(answer[-2])
    

느낀점

쉬운 문제인거 같은데 처음에 map에서 2차원 배열 입력받을 때 실수해서 한참을 디버깅 했다. 근데 map 입력부터 잘못하니깐 파이참에서 디버깅할 부분을 잘 못 짚어줘서 몇분을 낭비했는데 앞으로 쉬운 부분에서 실수하지말자;;

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글