16234번: 인구 이동

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

www.acmicpc.net


BFS를 이용하여 인접한 칸과의 차이가 L이상 R이하인지 확인하자! 시간초과가 나서 PyPy3으로 제출하였다.

 

  1. 방문여부를 확인하는 visited배열을 생성한다.
  2. arr[i][j]를 돌면서 인구 이동을 할 칸들을 저장할 trans배열을 생성한다.
  3. 4방향으로 차이가 L이상 R이하 인것이 있다면 queuetrans배열에 저장하고 방문 체크, flag, _sum을 update한다.
  4. 인구이동이 일어난다면(trans > 1) 각 칸을 _sum // len(trans)로 update한다.
  5. 인구 이동이 있었다면(flag) result 를 1 올려주고, 없다면 break해준다.

 

import sys
from collections import deque
input = sys.stdin.readline
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
N, L, R = map(int, input().split())
arr = []
for _ in range(N):
    arr.append(list(map(int, input().split())))

trans = []
result = 0

while True:
    flag = False
    visited = [[False]*(N) for _ in range(N)]

    for i in range(N):
        for j in range(N):
            if not visited[i][j]:
                queue = deque([[i, j]])
                visited[i][j] = True
                _sum = arr[i][j]
                trans = [[i, j]]

                while queue:
                    x, y = queue.popleft()
                    for k in range(4):
                        nx = x+dx[k]
                        ny = y+dy[k]
                        if 0 <= nx < N and 0 <= ny < N and not visited[nx][ny]:
                            if L <= abs(arr[x][y]-arr[nx][ny]) <= R:
                                visited[nx][ny] = True
                                queue.append([nx, ny])
                                trans.append([nx, ny])
                                _sum += arr[nx][ny]

                # 인구이동이 있었다면 
                if len(trans) > 1:
                    flag = True
                    for x, y in trans:
                        arr[x][y] = _sum//len(trans)
                        
    if flag:
        result += 1
    else:
        break

print(result)

'개발 > 알고리즘' 카테고리의 다른 글

[백준 1103] 게임 (python)  (0) 2021.04.22
[백준 15686] 치킨 배달 (python)  (0) 2021.04.22
[백준 16235] 나무 재테크 (python)  (0) 2021.04.20
[백준 2467] 용액 (python)  (0) 2021.04.20
[백준 2805] 나무자르기 (python)  (0) 2021.04.19
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기