본문 바로가기
ALGORITHM/BAEKJOON

[BOJ/Python] 16234. 인구 이동

by 안녕나는현서 2021. 10. 7.
728x90

📌 문제

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

 

16234번: 인구 이동

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

www.acmicpc.net

 

📌 문제 접근 방법

  1. 우선, 첫 번째 인구 이동이 일어나는 과정을 먼저 구현해보았다.
    방문한 적이 없는 곳이면 bfs(find_unit 함수)를 통해 연합을 구성하고 
    → 연합의 길이가 1보다 크다면 인구이동이 일어나므로 move함수를 통해 인구를 이동시킨다.
  2. 위의 코드를 이용해서 인구 이동이 더 이상 일어날 수 없을 때까지 인구 이동을 진행하고,
    인구 이동이 일어날 때 마다 카운트를 해줘야 한다.
    → 연합의 길이가 1보다 큰 경우를 units 리스트에 넣고 리스트가 비어있다면 while문 종료
    → 인구 이동이 일어난 경우 move함수 호출하고 카운팅
    → 81% 에서 시간초과
  3. 여러가지 시도를 해보다가 결국 pypy로 바꿔서 제출했더니 성공했다...!

 

📌 코드

# 백준 16234 인구 이동
from collections import deque

def move(unit, total):   
    for i, j in unit:
        country[i][j] = total // len(unit)


def find_unit(i, j):
    unit = [(i, j)]
    total = country[i][j]

    queue = deque()
    queue.append((i, j))

    dxy = [(1, 0), (-1, 0), (0, 1), (0, -1)]

    while queue:
        x, y = queue.popleft()

        for dx, dy in dxy:
            nx, ny = x+dx, y+dy

            if 0 <= nx < N and 0 <= ny < N and not visited[nx][ny]:
                diff = abs(country[x][y] - country[nx][ny])
                if L <= diff <= R:
                    visited[nx][ny] = 1
                    queue.append((nx, ny))

                    unit.append((nx, ny))
                    total += country[nx][ny]
    
    return unit, total


N, L, R = map(int, input().split())
country = [list(map(int, input().split())) for _ in range(N)]

cnt = 0
while True:
    visited = [[0 for _ in range(N)] for _ in range(N)]
    units = []

    for i in range(N):
        for j in range(N):
            if not visited[i][j]:
                visited[i][j] = 1
                unit, total = find_unit(i, j)

                if len(unit) > 1:
                    units.append((unit, total))

    if units:
        for unit, total in units:
            move(unit, total)
        cnt += 1
    else:
        break

print(cnt)
728x90

'ALGORITHM > BAEKJOON' 카테고리의 다른 글

[BOJ/Python] 1208. 부분수열의 합2  (0) 2021.10.08
[BOJ/Python] 2473. 세 용액  (0) 2021.10.07
[BOJ/Python] 1240. 노드사이의 거리  (0) 2021.10.04
[BOJ/Python] 1339. 단어 수학  (0) 2021.10.04
[BOJ/Python] 1520. 내리막 길  (0) 2021.10.04

댓글