[백준 17471] - 게리멘더링(JAVA)[골드4]

2024. 1. 15. 01:21· CodingTest/Baekjoon
목차
  1. 문제
  2. 문제 풀이
  3. 전체 코드

문제

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

 

17471번: 게리맨더링

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

www.acmicpc.net

 

문제 풀이

접근 방법에 대해서 많은 고민을 했다.

우선 지역구를 나누는 방법에 대해서 고민을 했는데,

  1. 조합을 써서 A와 B 지역구를 나누기
  2. 브루트포스로 나누기

두 방법 모두 하나의 지역을 정하면 나머지 구역의 지역을 결정 지을 수 있다.

브루트포스보단 코드적으로 깔끔한 조합을 사용해서 구역을 나눴다.

구역을 나눴다면 이젠 나눈 구역의 지역들이 연결되어 있는지를 확인해야한다.

여러 방법이 있지만 나는 BFS를 이용해서 지역들이 서로 연결되어 있는지 확인했다.

이제 A와 B의 구역이 서로 연결되어있는것을 확인했다면 구역의 인구차이를 계산해서 계속해서 업데이트 해주면 끝이다.

 

요약을 하자면

  1. 구역을 나누는 방법은 조합을 써서 나눔.
  2. 구역을 나눴다면 서로의 구역이 연결되어 있는지 확인
  3. 연결되어 있다면 인구차이를 계산

인구차이를 계산하는 과정에서 자바가 아직 어색해서 Collections의 배열 합을 계산하는 고차함수가 있을텐데

아직 알지 못해서 저렇게 코드를 작성해서 더해줬는데.. 이 부분이 조금 아쉽다.

 

전체 코드

import java.io.*;
import java.util.*;
public class Main {
static int n;
static BufferedReader br;
static StringTokenizer st;
static int[] graph;
static boolean[] visit;
static int answer = Integer.MAX_VALUE;
static ArrayList<Integer> other = new ArrayList<>();
static ArrayList<Integer> my = new ArrayList<>();
static ArrayList<ArrayList<Integer>> list;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
st = new StringTokenizer(br.readLine());
input();
}
public static void input() throws IOException {
n = Integer.parseInt(st.nextToken()); // 구역 수
graph = new int[n + 1];
st = new StringTokenizer(br.readLine());
list = new ArrayList<>(n + 1);
for (int i = 1; i <= n; i++) {
graph[i] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i <= n; i++) {
list.add(new ArrayList<>());
}
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
int amount = Integer.parseInt(st.nextToken());
for (int j = 0; j < amount; j++) {
int area = Integer.parseInt(st.nextToken());
list.get(i).add(area);
}
}
for (int i = 1; i < n; i++) {
init();
combination(i, 0, 1);
}
if (answer == Integer.MAX_VALUE) System.out.print(-1);
else System.out.print(answer);
}
public static void combination(int limit, int count, int cur) { //뽑아야할 것
if (count == limit) { //다 뽑았다는 뜻.
other.removeAll(my);
if (isConnected(my) && isConnected(other)) { //조합에 대해서 연결된것인지 확인 .. 그러면 반대편도 확인해야하지않나?
int myPeople = 0;
int otherPeople = 0;
for (int m : my) {
myPeople += graph[m];
}
for (int o : other) {
otherPeople += graph[o];
}
answer = Math.min(answer, Math.abs(myPeople - otherPeople));
}
init();
return;
}
for (int i = cur; i <= n; i++) {
my.add(i);
combination(limit, count + 1, i + 1);
my.remove(my.size() - 1);
}
}
public static void init() {
other.clear();
for (int i = 1; i <= n; i++) {
other.add(i);
}
}
public static boolean isConnected(ArrayList<Integer> ary) {
//s에 들어간곳끼리는 연결된곳이 확실하니 다른 집합을 확인해야함.
visit = new boolean[n + 1];
int count = 0;
Queue<Integer> q = new LinkedList<>();
q.add(ary.get(0));
while (!q.isEmpty()) {
int now = q.poll();
if (visit[now]) continue;
count++;
visit[now] = true;
for (int i = 0; i < list.get(now).size(); i++) {
int next = list.get(now).get(i);
if (ary.contains(next) && !visit[next]) { //구역에 포함되어있고, 방문안한곳이라면
q.add(next);
}
}
}
if (count == ary.size()) return true;
return false;
}
}

 

저작자표시 (새창열림)

'CodingTest > Baekjoon' 카테고리의 다른 글

[백준 16935] - 배열 돌리기3(JAVA)[골드5]  (0) 2024.01.17
[백준 16927] - 배열 돌리기2(JAVA)골드5]  (1) 2024.01.15
[백준 2887] - 행성터널(Java)[플레5]  (0) 2024.01.13
[백준 10026] - 적록색약(Java)[골드5]  (3) 2024.01.13
[백준 20181] - 꿈틀꿈틀 호석 애벌레 효율성(Kotlin)[골드2]  (6) 2023.11.08
  1. 문제
  2. 문제 풀이
  3. 전체 코드
'CodingTest/Baekjoon' 카테고리의 다른 글
  • [백준 16935] - 배열 돌리기3(JAVA)[골드5]
  • [백준 16927] - 배열 돌리기2(JAVA)골드5]
  • [백준 2887] - 행성터널(Java)[플레5]
  • [백준 10026] - 적록색약(Java)[골드5]
재한
재한
안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (504)
    • Skils (118)
      • Android (52)
      • C++ (5)
      • Kotlin (36)
      • Algorithm (24)
      • Server (1)
    • CodingTest (228)
      • Programmers (45)
      • Baekjoon (183)
    • Experience (8)
      • 후기(코딩테스트,프로그램,프로젝트) (8)
    • Computer Science (70)
      • Design Pattern (2)
      • OOP (2)
      • Computer Architecture (14)
      • OS (2)
      • Software Engineering (3)
      • DataBase (8)
      • Network (39)
    • 학교 (75)
      • R프로그래밍 (26)
      • 회계와 사회생활 (17)
      • 컴퓨터학개론 (20)
      • it기술경영개론 (12)

블로그 메뉴

  • 홈
  • 태그
  • 카테고리
  • 글쓰기
  • 설정

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
재한
[백준 17471] - 게리멘더링(JAVA)[골드4]
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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