알고리즘 풀이/백준

[백준 17779] 게리멘더링 2

mhko411 2021. 2. 25. 21:15
728x90

www.acmicpc.net/problem/17779

 

17779번: 게리맨더링 2

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

www.acmicpc.net


접근

x, y, d1, d2를 조건에 맞게 설정하고 5번 구역을 먼저 나눠준다. 

그리고 다른 구역들은 5번을 경계선으로 하여 선거구 안에 있는 인원들을 더해준다.

이때 5번 쪽으로 인덱스가 증감하도록 하여 5번을 만났을 때 break를 걸어준다.

 

구현

import sys
input = sys.stdin.readline


def partition(x, y, d1, d2):

    # 5번 표시
    cache = [[0 for _ in range(N+1)] for _ in range(N+1)]
    cache[x][y] = 5
    for i in range(1, d1+1):
        cache[x+i][y-i] = 5
        cache[x+d2+i][y+d2-i] = 5
    for i in range(1, d2+1):
        cache[x+i][y+i] = 5
        cache[x+d1+i][y-d1+i] = 5

    # 1번 선거구: 1 ≤ r < x+d1, 1 ≤ c ≤ y
    region1 = 0
    for r in range(1, x+d1):
        for c in range(1, y+1):
            if cache[r][c] == 5:
                break
            region1 += matrix[r][c]

    # 2번 선거구: 1 ≤ r ≤ x+d2, y < c ≤ N
    region2 = 0
    for r in range(1, x+d2+1):
        for c in range(N, y, -1):
            if cache[r][c] == 5:
                break
            region2 += matrix[r][c]


    # 3번 선거구: x+d1 ≤ r ≤ N, 1 ≤ c < y-d1+d2
    region3 = 0
    for r in range(x+d1, N+1):
        for c in range(1, y-d1+d2):
            if cache[r][c] == 5:
                break
            region3 += matrix[r][c]


    # 4번 선거구: x+d2 < r ≤ N, y-d1+d2 ≤ c ≤ N
    region4 = 0
    for r in range(x+d2+1, N+1):
        for c in range(N, y-d1+d2-1, -1):
            if cache[r][c] == 5:
                break
            region4 += matrix[r][c]


    region5 = total - (region1+region2+region3+region4)
    max_val = max(region1, max(region2, max(region3, max(region4, region5))))
    min_val = min(region1, min(region2, min(region3, min(region4, region5))))
    return max_val - min_val

N = int(input())
matrix = [[0]*(N+1)]

for _ in range(N):
    lst = [0]
    number = list(map(int, input().split()))
    lst.extend(number)
    matrix.append(lst)

total = 0
for y in range(1, N+1):
    for x in range(1, N+1):
        total += matrix[y][x]

answer = 100000000
for x in range(1, N+1):
    for y in range(1, N+1):
        for d1 in range(1, N+1):
            for d2 in range(1, N+1):
                if x+d1+d2 > N or y-d1 < 1 or y+d2 > N:
                    continue

                answer = min(answer ,partition(x, y, d1, d2))

print(answer)

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[백준 1463] 1로 만들기  (0) 2021.03.03
[백준 1436] 영화감독 숌  (0) 2021.03.02
[백준 17144] 미세먼지 안녕!  (0) 2021.02.25
[백준 2947] 나무 조각  (0) 2021.02.24
[백준 1244] 스위치 켜고 끄기  (0) 2021.02.24