Algorithem/백준 PS with code

백준 #17779 - [G3] 게리맨더링 2 : 구현, 브루트포스

2023. 5. 30. 23:50
목차
  1. 케이스 분리
  2. 코드

(python3)

 

17779번: 게리맨더링 2

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

www.acmicpc.net

 

 

케이스 분리

특별한 알고리즘은 없었고, 모든 경우의 수를 케이스 분리해서 해결했습니다. 구현에만 집중해서 중첩이 너무 많습니다. 그닥 매력적인 풀이는 아닌 것 같네요..

d1, d2, x, y 의 조건을 문제에서 줬기 때문에 거기에 맞춰서 작성했고, 문제에서는 x,y 를 1부터 시작하는 인덱스로 제시해서 그 부분만 0부터 시작하는 인덱스로 바꿔서 적용해줬습니다.

 

코드

def solution(input) : 
	# 입력 받기
    N = int(input().strip())
    PMAP = []
    for _ in range(N) :
        PMAP.append(list(map(int,input().split())))
    
    min_cal = [] # 최소값 저장
    for d1 in range(1,N) :
        for d2 in range(1,N) :
            for r in range(N) :
                for c in range(N) : # d1,d2,r,c의 모든 경우의 수 탐색
                    if r+d1+d2 <= N-1 and 0<=c-d1 and c+d2<=N-1 : # 경계가 조건에 부합하는지
                        g1,g2,g3,g4,g5 = 0,0,0,0,0 # 각 구역별 인구수 저장
                        for rr in range(N) :
                        	# 행들의 케이스 분리. pl, pr 은 경계 인덱스.
                            if rr < r : # 기준점보다 위쪽
                                pl = pr = -1
                            elif rr > r+d1+d2 : # 기준점보다 아래쪽
                                pl = pr = -2
                            elif rr == r : # 기준점
                                pl = pr = c
                                flag1 = 1
                                flag2 = 2
                            elif rr == r+d1+d2 : # 아래쪽 꼭지점
                                pl = pr = c-d1+d2
                                flag1 = 3
                                flag2 = 4
                            else : # 사이에 낀거
                                if rr <= r+d1 :
                                    pl -= 1
                                    flag1 = 1 # pl 왼쪽 구역이 몇번 구역인지 표시
                                    if rr == r+d1 : flag1 = 3
                                else :
                                    pl += 1
                                    flag1 = 3
                                if rr <= r+d2 :
                                    pr += 1
                                    flag2 = 2 # pr 오른쪽 구역이 몇번 구역인지 표시
                                else :
                                    pr -= 1
                                    flag2 = 4

                            for cc in range(N) :
                                p = PMAP[rr][cc]
                                if pl == -1 : # 기준보다 위쪽이면
                                    if cc <= c : # 왼쪽은 1번구역
                                        g1+=p
                                        gmap[rr][cc] = 1
                                        continue
                                    else : # 오른쪽은 2번 구역
                                        g2+=p
                                        gmap[rr][cc] = 2
                                        continue
                                elif pl == -2 : # 아래 꼭짓점보다 아래쪽이면
                                    if cc < c-d1+d2 : # 왼쪽은 3번 구역
                                        g3+=p
                                        gmap[rr][cc] = 3
                                        continue
                                    else : # 오른쪽은 4번 구역
                                        g4+=p
                                        gmap[rr][cc] = 4
                                        continue
                                else : # 경계면 안쪽이면
                                    if cc < pl : # 경계 왼쪽
                                        if flag1 == 1 :
                                            g1+=p
                                            gmap[rr][cc] = 1
                                        elif flag1 == 3 :
                                            g3+=p
                                            gmap[rr][cc] = 3
                                        continue
                                    elif pl <= cc and cc <= pr : # 경계 안쪽
                                        g5 += p
                                        gmap[rr][cc] = 5
                                        continue
                                    else : # 경계 오른쪽
                                        if flag2 == 2 :
                                            g2+=p
                                            gmap[rr][cc] = 2
                                        elif flag2 == 4 : 
                                            g4+=p
                                            gmap[rr][cc] = 4
                        # 최소, 최대 인구의 차 구하고, 차들의 최솟값 갱신하기
                        min_g = min([g1,g2,g3,g4,g5])
                        max_g = max([g1,g2,g3,g4,g5])
                        min_cal.append(max_g - min_g)
                        min_cal = [min(min_cal)]    
        
    print(min_cal[0])
solution(input)

 

my solved.ac :

 

solved.ac

알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.

solved.ac

 

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

백준 #13305 - [S3] 주유소 : 그리디  (0) 2023.06.01
백준 #20055 - [G5] 컨베이어 벨트 위의 로봇 : 구현  (0) 2023.05.31
백준 #1205 - [S4] 등수 구하기 : 구현  (0) 2023.05.29
백준 #2108 - [S3] 통계학 : 최빈값  (0) 2023.05.28
백준 #1806 - [G4] 부분합 : 두 포인터  (0) 2023.05.27
  1. 케이스 분리
  2. 코드
'Algorithem/백준 PS with code' 카테고리의 다른 글
  • 백준 #13305 - [S3] 주유소 : 그리디
  • 백준 #20055 - [G5] 컨베이어 벨트 위의 로봇 : 구현
  • 백준 #1205 - [S4] 등수 구하기 : 구현
  • 백준 #2108 - [S3] 통계학 : 최빈값
jamong5
jamong5
데이터 엔지니어를 희망하는 개발자 지망생
jamong5
JAMONG5
jamong5
전체
오늘
어제
  • 분류 전체보기 (171)
    • Algorithem (92)
      • 백준 PS with code (64)
      • 프로그래머스 PS with code (9)
      • 알고리즘 이론 (3)
    • Languages (19)
      • Python (10)
      • Java (2)
      • C & C++ (7)
    • SQL (42)
      • 프로그래머스 MySQL with code (41)
      • MySQL (1)
    • CS (2)
    • DevOps (4)
      • Docker (1)
      • Git, GitHub (3)
    • 코드 고민 (1)
    • 도움을 받은 정보 (2)
    • 책 (4)
    • 보드 게임 일기 (1)
    • 컴퓨터 일기 (2)
    • R&D 휴지통 (0)

블로그 메뉴

  • 소개
  • 홈
  • 태그

공지사항

인기 글

태그

  • backtracking
  • Git
  • 프로그래머스
  • 파이썬
  • heapq
  • LCS
  • 스택
  • 최소힙
  • 백트래킹
  • 투포인터
  • MySQL
  • 백준
  • 똥이
  • SQL
  • 알고리즘
  • Python
  • 그래프탐색
  • 구현
  • join
  • 시간초과

최근 댓글

최근 글

hELLO · Designed By 정상우.
jamong5
백준 #17779 - [G3] 게리맨더링 2 : 구현, 브루트포스
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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