코딩테스트

BFS&DFS_심화21) 인구이동 _ python

728x90

문제링크

https://www.acmicpc.net/problem/16234

 

16234번: 인구 이동

N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모

www.acmicpc.net

코드

# 인구이동 - bfs
from collections import deque
n, l , r = map(int, input().split())
graph = []
for _ in range(n):
    graph.append(list(map(int, input().split())))

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

def bfs(x, y):
    union = [(x, y)]
    que = deque([(x, y)])
    visited[x][y] = True
    total_population = graph[x][y]
    while que:
        x, y = que.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny]:
                if l <= abs(graph[x][y] - graph[nx][ny]) <= r:
                    visited[nx][ny] = True
                    que.append((nx, ny))
                    union.append((nx, ny))
                    total_population += graph[nx][ny]
    if len(union) > 1:
        new_population = total_population // len(union)
        for x, y in union:
            graph[x][y] = new_population
        return True
    return False
days = 0
while True:
    visited = [[False] * n for _ in range(n)]
    moved = False
    for i in range(n):
        for j in range(n):
            if not visited[i][j] and bfs(i, j):
                moved = True
    if not moved:
        break
    days += 1
print(days)
728x90