최근 코딩테스트 준비겸, 삼성 A형 기출문제들을 풀고 있는데, 삼성 기출문제는 대부분 비슷한 유형의 완전탐색이다.
https://www.acmicpc.net/problem/17471
17471번: 게리맨더링
선거구를 [1, 4], [2, 3, 5, 6]으로 나누면 각 선거구의 인구는 9, 8이 된다. 인구 차이는 1이고, 이 값보다 더 작은 값으로 선거구를 나눌 수는 없다.
www.acmicpc.net
Branch & Bound 기법을 이용하여 풀었다. 답은 될 수 없지만 초기 답을 한 선거구에만 사람이 몰렸을 때를 기준으로
설정하고, 선거구를 두개로 나눌 수 있는 모든방법으로 나눴을 때 그렇게 선거구가 나뉠 수 있는 지 검증하는 것은
시간이 걸리니까 그 방법으로 나눴을 때 값이 현재 답보다 유망한가를 먼저 계산 후, 검증을 나중에 한다. 그리고 검증이
되었을때 그 값을 답으로 바꾸고 다음 방법으로 넘어가는 방식으로 문제를 풀었다.
선거구를 나눌 수 있는 방법은 한 구역을 0번 선거구에 넣을것인가 1번선거구에 넣을것인가를 정하는 재귀함수를
사용하였으며, 모든 지역이 두 선거구로 나눠진후 검증은 각각에 선거구에 대해서 DFS로 탐색하여 한 선거구안에 있는
모든 구역을 탐색할 수 있으면 검증은 완료 된다.
https://github.com/MingNine9999/algorithm/blob/master/Problems/boj17471.cpp
MingNine9999/algorithm
Contribute to MingNine9999/algorithm development by creating an account on GitHub.
github.com
'프로그래밍 > 알고리즘 문제 풀이' 카테고리의 다른 글
백준 17370. 육각형 우리 속의 개미 (0) | 2020.05.22 |
---|---|
백준 17070. 파이프 옮기기 1_ver2 (DP) (0) | 2020.04.29 |
백준 17281. ⚾ (0) | 2020.04.27 |
백준 17070. 파이프 옮기기 1 (DFS) (0) | 2020.04.27 |
백준 16637. 괄호 추가하기 (0) | 2020.04.27 |