[백준] 16234 인구이동 in Python

2022. 1. 23. 22:15·Algorithm (PS)
728x90

 

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

 

16234번: 인구 이동

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

www.acmicpc.net

 

union 은 visited 여부를 확인하기 위한 리스트이다. 

 index는 while문을 중단시키기 위한 지점이 필요해서 만들었다. for 문 2번 돌면 인구이동을 각 칸에 대해 모두 진행했다는 것이므로 break 로 탈출한다. 

'인구이동' 즉 while문 한번씩 처음부터 끝까지 실행되는 횟수를 result 변수로 카운트하고 있다. 

Queue 가 다 비면 -> 연합 구성이 끝났다는 뜻 -> 인구이동 진행 : (연합의 인구수) / (연합에 속한 국가 수)

# 인구 이동
from collections import deque

n, l, m = map(int, input().split())
a = []

for i in range(n):
    a.append(list(map(int, input().split())))

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]


def bfs(x, y):
    people = a[x][y] # 연합의 전체 인구수
    count = 1
    united = []
    united.append((x, y))
    union[x][y] = 0
    q = deque()
    q.append((x, y))
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < n and union[nx][ny] == -1:
                if l <= abs(a[nx][ny] - a[x][y]) <= m: # 범위안에 속하는가 여부
                    people += a[nx][ny]
                    count += 1
                    united.append((nx, ny))
                    q.append((nx, ny))
                    union[nx][ny] = 0
    for i, j in united:
        a[i][j] = people // count

result = 0


while True:
    union = [[-1] * n for _ in range(n)]
    index = 0
    for i in range(n):
        for j in range(n):
            if union[i][j] == -1: # 아직 처리가 안된 곳 (not visited)
                bfs(i, j)
                index += 1
    # 인구 이동 끝 -> while 문 break할 조건이 필요해서 index를 사용했다 ! 
    if index == n*n:
        break
    result += 1

print(result)

 

728x90

'Algorithm (PS)' 카테고리의 다른 글

[카카오2019] 실패율 in Python  (0) 2022.01.25
[백준] 10825 국영수 in Python + lambda 함수 정리  (0) 2022.01.24
[백준] 1451 직사각형으로 나누기 in Python  (0) 2022.01.23
[백준] 14888 연산자 끼워넣기 Python  (0) 2022.01.22
[백준] 18405 경쟁적 전염 BFS 풀이  (0) 2022.01.22
'Algorithm (PS)' 카테고리의 다른 글
  • [카카오2019] 실패율 in Python
  • [백준] 10825 국영수 in Python + lambda 함수 정리
  • [백준] 1451 직사각형으로 나누기 in Python
  • [백준] 14888 연산자 끼워넣기 Python
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • Kubernetes
  • 스파크
  • EC2
  • 클라우드
  • 알고리즘
  • 쿠버네티스
  • Swift
  • BFS
  • dfs
  • 빅데이터
  • 데이터브릭스
  • python
  • Databricks
  • linux
  • docker
  • 백준
  • SPARK
  • 백트래킹
  • Leetcode
  • 데이터엔지니어링
  • dp
  • AWS
  • 파이썬
  • 코딩테스트
  • 데이터엔지니어
  • 카카오코딩테스트
  • 프로그래머스
  • 운영체제
  • 리눅스
  • ansible

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준] 16234 인구이동 in Python
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.