diff --git "a/BOJ/\353\266\210!/sumin.py" "b/BOJ/\353\266\210!/sumin.py" index b842f74e..5a9c6238 100644 --- "a/BOJ/\353\266\210!/sumin.py" +++ "b/BOJ/\353\266\210!/sumin.py" @@ -28,8 +28,8 @@ dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] -fire = [[-1] * c for _ in range(r)] # 불의 전파 시간 -jihoon = [[-1] * c for _ in range(r)] # 지훈이의 이동 시간 +fire = [[-1] * c for _ in range(r)] # 불의 전파 시간 +jihoon = [[-1] * c for _ in range(r)] # 지훈이의 이동 시간 q1 = deque() # 불의 전파에 대한 BFS 돌기 위한 큐 diff --git "a/BOJ/\353\271\231\354\202\260/sumin.py" "b/BOJ/\353\271\231\354\202\260/sumin.py" new file mode 100644 index 00000000..52fa1a4c --- /dev/null +++ "b/BOJ/\353\271\231\354\202\260/sumin.py" @@ -0,0 +1,76 @@ +""" +풀이시간: 40분 + + +- n: 행의 개수(3 <= m <= 300) +- m: 열의 개수(3 <= m <= 300) + + +1. 각 빙산 좌표에서 BFS를 통해 빙산이 몇 칸의 인접한 바다가 있는 만큼 빙산을 녹여준다. +2. 빙산이 모두 녹을 때까지 또는 빙산이 두 개 이상으로 분리될 때까지 시간을 증가시키며 반복한다. + +<시간복잡도> +O(10 * k * n*m) +- 10: 빙산 한 겹이 사라지는데 걸리는 시간 +- k: 빙산의 겹은 최대 100 +- n*m: 빙산 하나에 대한 BFS +""" +import sys + +input = sys.stdin.readline +from collections import deque + + +# 동서남북 +dx = [0, 0, 1, -1] +dy = [1, -1, 0, 0] + +# 행, 열의 개수 +n, m = map(int, input().split()) +graph = [list(map(int, input().split())) for _ in range(n)] # 그래프(빙산과 바다 정보) +ice = set() # 빙산 좌표 + +for i in range(n): + for j in range(m): + if graph[i][j] != 0: # 빙산 + ice.add((i, j)) + + +def bfs(x, y): # 빙산 좌표 BFS + q = deque([(x, y)]) + visited[x][y] = True + + while q: + x, y = q.popleft() + for i in range(4): # 인접한 네 방향을 모두 살펴봄 + nx, ny = x + dx[i], y + dy[i] + if not visited[nx][ny]: # 아직 방문하지 않은 칸 + if ( + graph[nx][ny] == 0 and graph[x][y] != 0 + ): # 인접한 칸이 바다(0)이고, 현재 위치는 빙산일 때 + graph[x][y] -= 1 # 빙산을 1 녹임 + if graph[nx][ny] != 0: # 인접한 칸이 빙산일 경우 -> 방문처리 후 큐에 추가 + visited[nx][ny] = True + q.append((nx, ny)) + if graph[x][y] == 0: # 바다에 의해 다 녹아버리는 빙산 좌표를 제거 + ice.remove((x, y)) + + +year = 0 # 빙산이 분리되는 최초의 시간(년) +while True: + cnt = 0 # 분리된 빙산의 수 + visited = [[False] * m for _ in range(n)] # 방문처리 배열 + ice_berg = ice.copy() + for r, c in ice_berg: # 빙산에 대해 BFS + if graph[r][c] != 0 and not visited[r][c]: + bfs(r, c) + cnt += 1 + # 빙산이 두 개 이상으로 분리된 경우 + if cnt >= 2: + print(year) + break + # 빙산이 분리되지 않은 경우 + if cnt == 0: + print(0) + break + year += 1