Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python] 백준 2573번 : 빙산 본문
728x90
<접근 방법>
[1] 빙산이 2개의 덩이로 분리되거나 다 녹을 때까지 분리되지 않는다면 끝인 종료 조건을 생각한다.
[2] 빙산이 있는 칸들은 BFS를 통해 각각 녹는 높이를 계산(사방 0인 칸의 개수)한다.
from collections import deque
def bfs(si, sj):
q = deque()
q.append((si, sj))
visited[si][sj] = 1
candidates = []
while q:
ci, cj = q.popleft()
cnt = 0
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = ci + di
nj = cj + dj
if 0<=ni<N and 0<=nj<M and not visited[ni][nj]:
if arr[ni][nj] == 0:
cnt += 1
else:
q.append((ni, nj))
visited[ni][nj] = 1
if cnt: candidates.append((ci, cj, cnt)) // 녹을 수 있는 칸과 녹는 높이 저장
for x, y, k in candidates:
arr[x][y] = max(0, arr[x][y]-k) // 0보다 더 녹지 않음
return
N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
visited = [[0]*M for _ in range(N)]
year = 0
while True:
visited = [[0]*M for _ in range(N)]
dump = 0
for i in range(N):
for j in range(M):
if arr[i][j] != 0 and not visited[i][j]: // 빙산이 존재하고 미방문이면
dump += 1 # 덩어리 + 1
if dump > 1: # 덩어리가 2개 이상이면 Break
break
bfs(i, j) # 그렇지 않으면 bfs를 통해 녹여주기
if dump > 1: # 덩어리가 2개 이상이면 Break
break
if dump > 1 or dump == 0: break // 종료 조건
year += 1
if dump == 0: # 덩어리가 끝까지 나뉘지 않는다면 0 출력
year = 0
print(year)
이해되지 않는 부분이 있으면 질문 주세요. 감사합니다.
728x90
'BFS & DFS' 카테고리의 다른 글
[Python] 백준 11559번 : Puyo Puyo (0) | 2024.06.20 |
---|---|
[Python] 백준 16928번 : 뱀과 사다리 게임 (0) | 2024.06.18 |
[Python](BFS) 백준 2636번 : 치즈 (0) | 2024.03.15 |
[Python](BFS) 백준 18405번 : 경쟁적 전염 (0) | 2024.01.30 |
[Python](DFS/백트래킹) 백준 1759번 : 암호 만들기 (2) | 2024.01.29 |