보물창고 블로그

백준 알고리즘 16234번 인구 이동 풀이 With Python 본문

알고리즘 풀이/백준 알고리즘

백준 알고리즘 16234번 인구 이동 풀이 With Python

홋 메 2020. 6. 30. 15:02
728x90

문제 링크: https://www.acmicpc.net/problem/16234

 

16234번: 인구 이동

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

www.acmicpc.net

이 문제는 각 나라마다 인구수 차이가 L명 이상 R명 이하인 경우가 없을 때까지 계속 인구이동을 하고, 인구이동을 한 횟수를 카운트하여 반환하는 문제입니다. 저는 flag를 사용하여 인구이동이 일어나지 않을 때는 flag를 0 값이 되게 하여 flag가 0인 경우에 while 문을 탈출하여 인구이동 횟수인 T를 반환하도록 하였습니다. 소스코드는 아래와 같습니다.

from collections import deque


def solution(n, l, r, map1):
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
    t = 0
    visit = [[-1] * n for _ in range(n)]
    queue = deque()
    while 1:
        flag = 0
        for i in range(n):
            for j in range(n):
                if visit[i][j] != t:
                    sub = [(i, j)]
                    visit[i][j] = t
                    queue.append([i, j])
                    while queue:
                        x, y = queue.popleft()
                        for d in range(4):
                            nx = x + dx[d]
                            ny = y + dy[d]
                            if -1 < nx < n and -1 < ny < n and visit[nx][ny] != t:
                                if l <= abs(map1[x][y] - map1[nx][ny]) <= r:
                                    sub.append((nx, ny))
                                    visit[nx][ny] = t
                                    queue.append((nx,ny))
                    if len(sub) > 1:
                        flag = 1
                        sum1 = 0
                        for p in sub:
                            sum1 += map1[p[0]][p[1]]
                        new = sum1 // len(sub)
                        for p in sub:
                            map1[p[0]][p[1]] = new
        if flag == 0:
            break
        else:
            t += 1
    return t


n, l, r = map(int, input().split())
map1 = [list(map(int, input().split())) for _ in range(n)]
ans=solution(n,l,r,map1)
print(ans)

소스코드에 대한 질문이 있으시면 댓글 남겨주시면 답변드리겠습니다. 읽어주셔서 감사합니다. : - )

Comments