Algorithem/백준 PS with code

백준 #16234 - [G5] 인구 이동 : 그래프탐색, 그룹핑

2023. 6. 13. 01:22
목차
  1. DFS로 그룹 지어주기, 재귀 최대 깊이 설정
  2. 코드

(python3)

 

16234번: 인구 이동

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

www.acmicpc.net

 

DFS로 그룹 지어주기, 재귀 최대 깊이 설정

open_border() 에서는 모든 칸들에 대해 DFS 를 수행해서 그룹을 만들어줍니다. 이미 그룹이 정해진 노드는 DFS 를 수행할 필요가 없으므로 넘어갑니다.

population_move(g) 에서는 최대 그룹 번호를 넣어서 dict 의 초기 세팅을 진행합니다. dict에는 그룹마다 총 인구수, 포함되는 나라 수, 나라의 좌표를 저장합니다.

dict 를 완성한 뒤, dict 에 저장된 정보에 따라 인구수를 모두 새로 배당해줍니다.

재귀로 DFS 를 구현했기 때문에 재귀 최대 깊이를 늘려줄 필요가 있습니다.

 

코드

import sys
sys.setrecursionlimit(100000)
def solution(input) :
    N,L,R = list(map(int,input().split()))
    population_map = []
    for _ in range(N) :
        population_map.append(list(map(int,input().split())))
    D = [(-1,0),(1,0),(0,-1),(0,1)]

    def dfs(r,c,g) :
        if visit[r][c] : # 들른적 있으면
            return
        visit[r][c] = g
        for dr,dc in D :
            nr = r+dr
            nc = c+dc
            if nr>=0 and nr<N and nc>=0 and nc<N and abs(population_map[r][c]-population_map[nr][nc]) >= L and  abs(population_map[r][c]-population_map[nr][nc]) <= R:
                dfs(nr,nc,g)

    def open_border() :
        g = 0
        for r in range(N) :
            for c in range(N) :
                if visit[r][c] :
                    continue
                else :
                    g+=1
                    dfs(r,c,g)
        if g == N*N : # 경계가 하나도 안열린경우
            return -1
        else :
            return g
    
    def population_move(g) :
        pop_dict = {
            gn : {
                'pop_sum' : 0,
                'pop_count' : 0,
                'points' : []
            }
            for gn in range(1,g+1)
        }

        for r in range(N) :
            for c in range(N) :
                g = visit[r][c]
                pop_dict[g]['pop_sum'] += population_map[r][c]
                pop_dict[g]['pop_count'] += 1
                pop_dict[g]['points'].append((r,c))

        for gn in pop_dict :
            n_pop = pop_dict[gn]['pop_sum'] // pop_dict[gn]['pop_count']
            for r,c in pop_dict[gn]['points'] :
                population_map[r][c] = n_pop

    cnt = 0
    while True :
        visit = [[0 for _ in range(N)] for _ in range(N)]
        g = open_border()
        if g == -1 :
            print(cnt)
            return
        else :
            cnt+=1
            population_move(g)

input = sys.stdin.readline
solution(input)

 

my solved.ac :

 

solved.ac

알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.

solved.ac

 

'Algorithem > 백준 PS with code' 카테고리의 다른 글

백준 #2098 - [G1] 외판원 순회 : DP,비트마스킹  (0) 2023.06.15
백준 #20056 - [G4] 마법사 상어와 파이어볼 : 구현  (0) 2023.06.13
백준 #3758 - [S3] KCPC : 정렬  (0) 2023.06.12
백준 #2467 - [G5] 용액 : binary search (이진탐색)  (1) 2023.06.10
백준 #2166 - [G5] 다각형의 면적 : 신발끈 공식  (0) 2023.06.08
  1. DFS로 그룹 지어주기, 재귀 최대 깊이 설정
  2. 코드
'Algorithem/백준 PS with code' 카테고리의 다른 글
  • 백준 #2098 - [G1] 외판원 순회 : DP,비트마스킹
  • 백준 #20056 - [G4] 마법사 상어와 파이어볼 : 구현
  • 백준 #3758 - [S3] KCPC : 정렬
  • 백준 #2467 - [G5] 용액 : binary search (이진탐색)
jamong5
jamong5
데이터 엔지니어를 희망하는 개발자 지망생
jamong5
JAMONG5
jamong5
전체
오늘
어제
  • 분류 전체보기 (171)
    • Algorithem (92)
      • 백준 PS with code (64)
      • 프로그래머스 PS with code (9)
      • 알고리즘 이론 (3)
    • Languages (19)
      • Python (10)
      • Java (2)
      • C & C++ (7)
    • SQL (42)
      • 프로그래머스 MySQL with code (41)
      • MySQL (1)
    • CS (2)
    • DevOps (4)
      • Docker (1)
      • Git, GitHub (3)
    • 코드 고민 (1)
    • 도움을 받은 정보 (2)
    • 책 (4)
    • 보드 게임 일기 (1)
    • 컴퓨터 일기 (2)
    • R&D 휴지통 (0)

블로그 메뉴

  • 소개
  • 홈
  • 태그

공지사항

인기 글

태그

  • backtracking
  • heapq
  • SQL
  • 백트래킹
  • 스택
  • 최소힙
  • 알고리즘
  • 투포인터
  • 구현
  • 파이썬
  • 시간초과
  • 그래프탐색
  • LCS
  • Python
  • MySQL
  • join
  • 똥이
  • 프로그래머스
  • Git
  • 백준

최근 댓글

최근 글

hELLO · Designed By 정상우.
jamong5
백준 #16234 - [G5] 인구 이동 : 그래프탐색, 그룹핑
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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