[백준] 17471번: 게리맨더링 (파이썬/Python) - bfs, brute force

2022. 12. 25. 11:13·Algorithm (PS)
728x90

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

 

17471번: 게리맨더링

선거구를 [1, 4], [2, 3, 5, 6]으로 나누면 각 선거구의 인구는 9, 8이 된다. 인구 차이는 1이고, 이 값보다 더 작은 값으로 선거구를 나눌 수는 없다.

www.acmicpc.net

0) 그래프 입력 받기 : 파이썬의 defaultdict이라는 훌륭한 내장 라이브러리가 있는데, 이걸 활용하면 쉽다. 
그리고 문제에서 1부터 카운트하므로 -1 처리를 해주어서, 0부터 노드가 시작하게끔 처리해주었다. 이래야 나중에 index값으로 접근하기 용이하므로..

graph = defaultdict(list)

for i in range(n):
    data = list(map(int, input().split()))
    for j in range(1, data[0] + 1):
        graph[i].append(data[j]-1)

1) 선거구를 나누기 : combination 내장 라이브러리를 써서 나누었다. 
1 개이상 n//2 개 이하로 파라미터를 주었는데, 순서가 없는 조합쌍이어서, 절반이상 확인하면 중복이 생긴다. 따라서 1~n 개까지 모두 확인할 필요가 없다. 

index = [i for i in range(n)]
for i in range(1, n//2+1):
    for combi in combinations(index, i):
        # first
        sum1, v1 = bfs(list(combi))
        diff_combi = set(index) - set(combi)
        sum2, v2 = bfs(list(diff_combi))

2) 나눈 선거구가 이어져있는지 확인하기 : bfs를 이용하여 풀었다. 
visited 처리를 하는 방법이 다양하겠지만, 미리 그래프를 초기화 해놓지 않고, 방문한 도시를 집어넣는 방식으로 처리했다. 

def bfs(group):
    queue = deque()
    visited = set()
    queue.append(group[0])
    visited.add(group[0])
    total = 0
    while queue:
        now = queue.popleft()
        total += array[now]
        for next in graph[now]:
            if next in group and next not in visited:
                queue.append(next)
                visited.add(next)

    return total, len(visited)

 

전체코드

import sys
from itertools import combinations
from collections import deque, defaultdict
input = sys.stdin.readline

n = int(input())
INF = int(1e9)
answer = INF # 인구 차이의 최솟값
array = list(map(int, input().split())) # 구역의 인구수
graph = defaultdict(list)

for i in range(n):
    data = list(map(int, input().split()))
    for j in range(1, data[0] + 1):
        graph[i].append(data[j]-1)


def bfs(group):
    queue = deque()
    visited = set()
    queue.append(group[0])
    visited.add(group[0])
    total = 0
    while queue:
        now = queue.popleft()
        total += array[now]
        for next in graph[now]:
            if next in group and next not in visited:
                queue.append(next)
                visited.add(next)

    return total, len(visited)



index = [i for i in range(n)]
for i in range(1, n//2+1):
    for combi in combinations(index, i):
        # first
        sum1, v1 = bfs(list(combi))
        diff_combi = set(index) - set(combi)
        sum2, v2 = bfs(list(diff_combi))

        if v1 + v2 == n:
            answer = min(answer, abs(sum1 - sum2))

if answer == INF:
    print(-1)
else:
    print(answer)
728x90

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

[백준] 20115번: 에너지 드링크 (Python/파이썬) - Greedy  (0) 2022.12.25
백준 17615번: 볼 모으기 (Python/파이썬) - Greedy  (0) 2022.12.25
백준 17406번: 배열 돌리기 4 (Python/파이썬)  (0) 2022.12.24
[백준] 2098 외판원 순회 Swift  (0) 2022.12.17
[백준] 12933번 : 오리 Swift 풀이 - 구현  (0) 2022.12.16
'Algorithm (PS)' 카테고리의 다른 글
  • [백준] 20115번: 에너지 드링크 (Python/파이썬) - Greedy
  • 백준 17615번: 볼 모으기 (Python/파이썬) - Greedy
  • 백준 17406번: 배열 돌리기 4 (Python/파이썬)
  • [백준] 2098 외판원 순회 Swift
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

인기 글

태그

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

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준] 17471번: 게리맨더링 (파이썬/Python) - bfs, brute force
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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