Skip to content

Commit e374f87

Browse files
committed
[BOJ] 16234 인구 이동 (G4)
1 parent 927c227 commit e374f87

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

최어진/7주차/260215.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# 백준 16234번: 인구 이동 (2회차)
2+
3+
import sys
4+
sys.setrecursionlimit(10**5)
5+
6+
input = sys.stdin.readline
7+
8+
# N <= 50
9+
# L, R <= 10^2
10+
N, L, R = map(int, input().rstrip().split())
11+
maps = [list(map(int, input().rstrip().split())) for _ in range(N)]
12+
13+
# 한 번의 인구 이동마다 모든 국가에 대해서 연합 조사
14+
# -> flood fill 방식으로 DFS 돌리면 될 듯...? -> O(N^2) ~= 10^3
15+
# 인구 이동을 몇 번 해야 될 지는 모르겠으나, 모든 국가의 개수마다 한 번씩 하면 얼추 되지 않을까 예상
16+
# -> 10^3
17+
18+
moves = [
19+
[0, 1],
20+
[0, -1],
21+
[1, 0],
22+
[-1, 0],
23+
]
24+
25+
current_union = 0
26+
stack = []
27+
visited = None
28+
29+
def migrate(r, c):
30+
# print(f'dfs({r}, {c})')
31+
for dr, dc in moves:
32+
if 0 <= r + dr < N and 0 <= c + dc < N:
33+
if not visited[r + dr][c + dc]:
34+
if L <= abs(maps[r][c] - maps[r + dr][c + dc]) <= R:
35+
global current_union
36+
stack.append((r + dr, c + dc))
37+
visited[r + dr][c + dc] = True
38+
current_union += maps[r + dr][c + dc]
39+
migrate(r + dr, c + dc)
40+
41+
answer = 0
42+
while True:
43+
# print(f'* year: {answer}')
44+
visited = [[False for _ in range(N)] for _ in range(N)]
45+
cnt = 0
46+
47+
for r in range(N):
48+
for c in range(N):
49+
# 방문하지 않은 칸에 대해서 연합 조사
50+
if not visited[r][c]:
51+
cnt += 1
52+
53+
# 연합 생성
54+
stack.append((r, c))
55+
visited[r][c] = True
56+
current_union += maps[r][c]
57+
migrate(r, c)
58+
59+
# 생성된 연합에 대해서 인구 분배
60+
if len(stack) > 1:
61+
# print('---------------')
62+
# print(f'{cnt}번째 인구 이동')
63+
num_humans = current_union // len(stack)
64+
for sr, sc in stack:
65+
maps[sr][sc] = num_humans
66+
# for row in maps:
67+
# print(row)
68+
# print('---------------')
69+
70+
# 연합 해제 처리
71+
current_union = 0
72+
stack.clear()
73+
74+
if cnt == N**2: break
75+
76+
# for row in maps:
77+
# print(row)
78+
# print()
79+
80+
answer += 1
81+
82+
print(answer)

0 commit comments

Comments
 (0)