PS/백준

[BOJ] 17779 게리맨더링 2 (C/C++)

uyt8989 2022. 3. 26. 16:13
 

17779번: 게리맨더링 2

재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름

www.acmicpc.net

문제

재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름도 재현시로 변경했다. 이번 선거에서는 최대한 공평하게 선거구를 획정하려고 한다.

재현시는 크기가 N×N인 격자로 나타낼 수 있다. 격자의 각 칸은 구역을 의미하고, r행 c열에 있는 구역은 (r, c)로 나타낼 수 있다. 구역을 다섯 개의 선거구로 나눠야 하고, 각 구역은 다섯 선거구 중 하나에 포함되어야 한다. 선거구는 구역을 적어도 하나 포함해야 하고, 한 선거구에 포함되어 있는 구역은 모두 연결되어 있어야 한다. 구역 A에서 인접한 구역을 통해서 구역 B로 갈 수 있을 때, 두 구역은 연결되어 있다고 한다. 중간에 통하는 인접한 구역은 0개 이상이어야 하고, 모두 같은 선거구에 포함된 구역이어야 한다.

선거구를 나누는 방법은 다음과 같다.

  1. 기준점 (x, y)와 경계의 길이 d1, d2를 정한다. (d1, d2 ≥ 1, 1 ≤ x < x+d1+d2 ≤ N, 1 ≤ y-d1 < y < y+d2 ≤ N)
  2. 다음 칸은 경계선이다.
    1. (x, y), (x+1, y-1), ..., (x+d1, y-d1)
    2. (x, y), (x+1, y+1), ..., (x+d2, y+d2)
    3. (x+d1, y-d1), (x+d1+1, y-d1+1), ... (x+d1+d2, y-d1+d2)
    4. (x+d2, y+d2), (x+d2+1, y+d2-1), ..., (x+d2+d1, y+d2-d1)
  3. 경계선과 경계선의 안에 포함되어있는 곳은 5번 선거구이다.
  4. 5번 선거구에 포함되지 않은 구역 (r, c)의 선거구 번호는 다음 기준을 따른다.
    • 1번 선거구: 1 ≤ r < x+d1, 1 ≤ c ≤ y
    • 2번 선거구: 1 ≤ r ≤ x+d2, y < c ≤ N
    • 3번 선거구: x+d1 ≤ r ≤ N, 1 ≤ c < y-d1+d2
    • 4번 선거구: x+d2 < r ≤ N, y-d1+d2 ≤ c ≤ N

아래는 크기가 7×7인 재현시를 다섯 개의 선거구로 나눈 방법의 예시이다.

구역 (r, c)의 인구는 A[r][c]이고, 선거구의 인구는 선거구에 포함된 구역의 인구를 모두 합한 값이다. 선거구를 나누는 방법 중에서, 인구가 가장 많은 선거구와 가장 적은 선거구의 인구 차이의 최솟값을 구해보자.

입력

첫째 줄에 재현시의 크기 N이 주어진다.

둘째 줄부터 N개의 줄에 N개의 정수가 주어진다. r행 c열의 정수는 A[r][c]를 의미한다.

출력

첫째 줄에 인구가 가장 많은 선거구와 가장 적은 선거구의 인구 차이의 최솟값을 출력한다.

제한

  • 5 ≤ N ≤ 20
  • 1 ≤ A[r][c] ≤ 100

처음 읽을 때 도대체 문제가 무슨 소리를 하고 있는건지 헷갈렸다. 자세히 읽다보니 단순한 완전 탐색으로도 풀 수 있는 문제였다. 하지만 조건문의 조건을 설정하는 것이 까다로웠다. 

 

우선 가능한 x, y, d1, d2의 조합을 찾기 위해서 for문을 4개 만들었다. for문의 반복 횟수는 \( 20^4 = 160,000 \) 정도다. 그리고 나서 해당 조합에서의 선거구을 나눠야한다. 이때 모든 구역을 다 돌아야 하기 때문에 선거구를 한번 나누는 것의 시간복잡도는 \( O(N^2) \) 이다. 따라서 연산의 개수를 \( 20^4 * 20^2 = 64,000,000 \) 정도로 추정할 수 있다. 1초 안에 충분히 가능하기 때문에 해당 방법을 선택했다.

 

선거구를 마킹한 이후에 다시 인구수를 세는 방법으로 해결한 분들도 계셨다. 하지만 내가 생각하기엔 선거구를 마킹하는건 생략할 수 있는 과정이다. 물론 선거구를 마킹하는게 훨씬 덜 헷갈리긴 한다. 처음부터 해당 방법으로 접근했으면 문제 푸는데 시간이 덜 걸렸을 것 같다.

 

 

후기)

문제 풀면서 겪는 어려운 일의 80%는 문제를 제대로 이해하지 못 해서 생기는 문제인 것 같다.

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

[BOJ] 19237 어른 상어 (C/C++)  (0) 2022.04.26
[BOJ] 15684 사다리 조작 (C/C++)  (0) 2022.04.24
[BOJ] 14938 서강그라운드 (C/C++)  (0) 2022.03.24
[BOJ] 5639 이진 검색 트리 (C/C++)  (0) 2022.03.23
[BOJ] 1918 후위 표기식 (C/C++)  (0) 2022.03.22