본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 16234 인구 이동

by Alan_Kim 2023. 4. 5.
728x90
반응형

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

 

16234번: 인구 이동

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

www.acmicpc.net

 

문제 해결

  • 인구 이동이 진행될 때마다 계속 반복해서 진행하므로 시뮬레이션을 생각할 수 있다.
  • 인구 이동 지역을 저장해야하므로 bfs를 이용해서 인구 이동 지역을 저장한후 평균을 그 지역 값에 넣어서 인구이동을 시킬 수 있다.
  • 인구이동이 없으면 멈춰야한다. 이 부분에서 고민을 많이 했는데 이동한 지역이 없으면 인구 이동을 멈추는 변수 flag를 사용하여 인구 이동이 있으면 flag=1로 바꾸어 계속 진행하고 flag가 0으로 코드 끝에 유지되면 반복문을 종료하고 시간을 출력하면 된다.

 

CODE

from collections import deque
def bfs(a,b):
    que = deque()
    que.append((a,b))
    memo = [(a,b)]
    while que:
        x, y = que.popleft()
        for dx, dy in zip (dxs, dys):
            new_x = x + dx
            new_y = y + dy
            if 0<=new_x<n and 0<=new_y<n and visited[new_x][new_y]==0 and l<=abs(graph[new_x][new_y]-graph[x][y])<=r:
                visited[new_x][new_y] = 1
                memo.append((new_x,new_y))
                que.append((new_x,new_y))
    return memo
def simulate():
    global ans
    while True:
        flag = 0 # 반복문 종료: flag =0  반복문 유지 flag = 1
        for i in range(n):
            for j in range(n):
                visited[i][j] = 0
        for i in range(n):
            for j in range(n):
                if visited[i][j] ==0:
                    visited[i][j] = 1
                    c = bfs(i,j)
                    if len(c) > 1:
                        flag = 1
                        m_total = sum([graph[x][y] for x, y in c])//len(c)
                        for x, y in c:
                            graph[x][y] = m_total
        if flag ==0: 
            break
        ans += 1
    print(ans)
    return

if __name__=='__main__':
    n, l, r = map(int, input().split())
    graph = [list(map(int, input().split())) for _ in range(n)]
    visited = [[0]*n for _ in range(n)]
    dxs = [-1,1,0,0]
    dys = [0,0,-1,1]
    ans = 0
    simulate()
728x90
반응형

'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글

[python] 백준 8980 택배  (0) 2023.04.06
[python] 백준 1781 컵라면  (0) 2023.04.05
[python] 백준 1911 흙길 보수하기  (0) 2023.04.05
[python] 백준 12919 A와 B 2  (0) 2023.04.05
[python] 백준 1422 숫자의 신  (0) 2023.04.05

댓글