[BOJ] Q16234 인구 이동

Question

Language: Python

Difficulty: Gold 5

국경선을 경계로 인구 수 차이가 L~R 인 두 나라는 경계선을 열고 서로 열고, 같은 연합에 속하게 된다.

우선, BFS을 통한 component을 찾아서 해당 component에 대해 개별적으로 인구 이동을 진행한다.

이 과정을 component 개수가 노드의 개수 만큼 될때까지 반복한다. (component=노드 ==> 더 이상 연합이 존재하지 않는 다는 의미이다.)

그래프에서 component 개수는 bfs을 실행한 총 회수인것이다.

Component Search

for i in range(1,n+1):
    for j in range(1,n+1):
        if not visited[i][j]:
            bfs(i,j)
            count+=1

여기서 count가 총 component 개수이다.

Solution

from math import pow
from collections import deque
def bfs(row,col):
    # component을 구해서 해당 component에 대한 인구 이동 작업을 처리한다.
    union=[(row,col)]
    visited[row][col]=True
    q=deque()
    q.append((row,col))
    sumOfCitizens=graph[row][col]
    count=1
    while q:
        row,col=q.popleft()
        
        for dir in range(4):
            new_row=row+dy[dir]
            new_col=col+dx[dir]

            if new_row < 0 or new_row >=n or new_col <0 or new_col>=n:
                continue

            if visited[new_row][new_col]:
                continue

            #인구 수 차이 L~R 사이면 component에 추가
            if L<=abs(graph[new_row][new_col]-graph[row][col])<=R:
                union.append((new_row,new_col))
                q.append((new_row,new_col))
                sumOfCitizens+=graph[new_row][new_col]
                count+=1
                visited[new_row][new_col]=True
                
    #인구 이동 진행
    for row,col in union:
        graph[row][col]= sumOfCitizens//count
    return union

if __name__ == "__main__":
    n,L,R=map(int,input().split())
    graph=[]
    for _ in range(n):
        graph.append(list(map(int,input().split())))

    answer=0  
    dy=[-1,0,1,0]
    dx=[0,1,0,-1]
  
    while True:
        index=0
        visited=[[False]*n for _ in range(n)]      
        for row in range(n):
            for col in range(n):
                if visited[row][col]:
                    continue
                visited[row][col]=True
                bfs(row,col)
                index+=1
        if index== int(pow(n,2)):
            break
        answer+=1
print(answer)

댓글남기기