백준 16234 문제와 동일
- 링크
국경선을 공유하는 두 나라의 인구 차이가 L명 이상, R명 이하면, 두 나라가 공유하는 국경선을 하루 동안 연다.
연합 각 칸의 인구수 (연합의 인구수 / 칸의 개수) , 소수점은 버린다.
연합 해체하고, 국경선을 닫는다.
인구 이동이 며칠 동안 발생하는지 구하라.
## 입력
n, l, r = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
## bfs 만들기
from collections import deque
dx = [1, -1, 0, 0]
dy = [0,0, -1, 1]
def bfs(x,y):
q = deque()
q.append((x,y))
united = []
united.append((x,y)) # 연합 가능한 국가 좌표 모으기
con_count = 1 # 나라 수
con_pop = graph[x][y] # 나라 인구
while q :
x,y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0<= nx <n and 0<=ny <n and visited[nx][ny] == 0 :
if l <= abs(graph[nx][ny] - graph[x][y]) <= r: # 연합 가능하면
visited[nx][ny] = 1 # 방문처리
q.append((nx,ny))
united.append((nx,ny))
con_count += 1 # 나라 수 추가
con_pop += graph[nx][ny] # 나라 인구수 추가
return united, con_count, con_pop # 나라 좌표, 나라 수, 나라 인구수
## 메인
answer = 0
while True :
flag = False
visited = [[0]*n for _ in range(n)] # 방문 만들기
for i in range(n):
for j in range(n): # 지도 전체 탐색
if visited[i][j] == 0 : # 미방문이면
visited[i][j] = 1
country , country_num , country_population = bfs(i,j)
if country_num > 1 : # 연합가능하면
flag = True
even_pop = country_population//country_num # 인구 배분
for a, b in country :
graph[a][b] = even_pop # 배분된 인구 배분
if flag == False:
break
answer += 1 # 횟수 상승
# 정답 출력
print(answer)