2638번: 치즈
첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5≤N, M≤100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표
www.acmicpc.net
BFS를 통해 해결한다. 외부공기와 치즈 내부의 공간을 구분해야하므로 외부공기를 -1로 바꾼다.
- 시작점을 queue에 담는다.
- 상하좌우 칸을 확인한다.
- 만약 0이라면 외부 공기이므로 -1로 바꾸고 queue에 담아준다.
- 0보다 크다면 치즈이므로 인접한벽을 하나 늘려준다.
- 만약 인접한벽이 2 이상이라면 nextqueue에 담아준다.
- 다 돌았다면 queue를 nextqueue로 바꾸어준다.
- flag를 통해 치즈가 없다면 break한다.
import sys from collections import deque dx = [0, 0, -1, 1] dy = [-1, 1, 0, 0] input = sys.stdin.readline N, M = map(int, input().split()) arr = [] for _ in range(N): arr.append(list(map(int, input().split()))) answer = 0 queue = deque([[0, 0]]) while True: nextqueue = deque() answer += 1 flag = True while queue: x, y = queue.popleft() for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 <= nx < N and 0 <= ny < M: if arr[nx][ny] == 0: arr[nx][ny] = -1 queue.append([nx, ny]) elif arr[nx][ny] > 0: flag = False arr[nx][ny] += 1 if arr[nx][ny] > 2: nextqueue.append([nx, ny]) arr[nx][ny] = -1 queue = nextqueue if flag: break print(answer-1)
'개발 > 알고리즘' 카테고리의 다른 글
[백준 11723] 집합 (java) (0) | 2021.08.12 |
---|---|
[백준 2224] 명제 증명 (python) (0) | 2021.07.12 |
[백준 16719] ZOAC (python) (0) | 2021.05.31 |
[백준 9934] 완전 이진 트리 (python) (0) | 2021.05.31 |
[백준 9470] Strahler 순서 (python) (0) | 2021.05.31 |
최근댓글