컴공생의 다이어리
[파이썬, Python] 백준 17779번 : 게리맨더링 2 본문
백준 17779번 : 게리맨더링 2
내 코드
import sys
input = sys.stdin.readline
def simulation(x, y, d1, d2):
section = [0] * 5 # 구역별 인구 수
temp_c = y
for r in range(x + d1): # 1구역 인구 합 구하기
if r >= x:
temp_c -= 1
section[0] += sum(data[r][0:temp_c + 1])
temp_c = y - d1 - 1
for r in range(x + d1, n): # 3구역 인구 합 구하기
section[2] += sum(data[r][0:temp_c + 1])
if r < x + d1 + d2:
temp_c += 1
temp_c = y + 1
for r in range(x + d2 + 1): # 2구역 인구 합 구하기
if r > x:
temp_c += 1
section[1] += sum(data[r][temp_c:])
temp_c = y + d2
for r in range(x + d2 + 1, n): # 4구역 인구 합 구하기
section[3] += sum(data[r][temp_c:])
if r <= x + d1 + d2:
temp_c -= 1
section[4] = total - sum(section) # 5구역 인구 합 구하기
return max(section) - min(section)
n = int(input()) # 재현시의 크기
data = [list(map(int, input().split())) for _ in range(n)] # 구역별 인구수
total = sum(map(sum, data)) # 인구수 총합
result = int(1e9) # 인구가 가장 많은 선거구와 가장 적은 선거구의 인구 차이의 최솟값
for x in range(n - 2): # 기준점 (x, y) : 0 <= x < N-2, 1 <= y < N-1
for y in range(1, n - 1):
for d1 in range(1, y + 1): # 경계 d1, d2 : 1 <= d1 <= y, 1 <= d2 <= N-y
for d2 in range(1, n - y + 1):
if x + d1 + d2 < n and y - d1 >= 0 and y + d2 < n:
result = min(result, simulation(x, y, d1, d2))
else:
break
print(result)
728x90
'Development > Algorithm & Coding Test' 카테고리의 다른 글
[파이썬, Python] 백준 16954번 : 움직이는 미로 탈출 (0) | 2023.03.15 |
---|---|
[파이썬, Python] 백준 16637번 : 괄호 추가하기 (0) | 2023.03.10 |
[자바, Java] 백준 2023번 : 수들의 합 5 (0) | 2023.02.10 |
[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 - MySQL (0) | 2023.01.25 |
[프로그래머스] 가격이 제일 비싼 식품의 정보 출력하기 - MySQL (0) | 2023.01.05 |
Comments