문제 링크 : https://www.acmicpc.net/problem/16234
난이도 : 골드 4
문제 유형 : 그래프, 너비 우선 탐색
N
: 나라의 수L
, R
: 인구 차이의 범위A[r][c]
: 각 나라의 인구 수import sys
input = sys.stdin.readline
from collections import deque
N, L, R = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
answer = 0
def bfs(si, sj):
q = deque()
q.append((si, sj))
visited[si][sj] = 1
union = [(si, sj)]
total = arr[si][sj]
while q:
y, x = q.popleft()
for iy, ix in ((-1, 0), (1, 0), (0, 1), (0, -1)):
dy = y + iy
dx = x + ix
if 0 <= dy < N and 0 <= dx < N:
if visited[dy][dx] == 0:
if L <= abs(arr[y][x] - arr[dy][dx]) <= R: # 연합 조건에 맞는 경우
q.append((dy, dx)) # 큐에 위치 추가
visited[dy][dx] = 1 # 방문 표시
union.append((dy, dx)) # 연합에 추가
total += arr[dy][dx] # 총 인구수 합산
if len(union) > 1: # 연합인 경우
avg = total // len(union) # 연합의 새로운 인구 평균 계산
for y, x in union: # 인구 이동
arr[y][x] = avg
return 1 # 연합 발생하면 1 리턴
return 0 # 연합 없었던 경우 0 리턴
while True:
visited = [[0]*N for _ in range(N)]
flag = 0 # 인구 이동 확인 플래그
for i in range(N):
for j in range(N):
if visited[i][j] == 0: # 미방문한 곳 연합 확인
flag = max(flag, bfs(i, j))
if flag == 0: # 인구 이동이 없었으면 종료
break
answer += 1
print(answer)