Study/BOJ

[BOJ] 17471. 게리맨더링

MuviSsum 2021. 2. 2. 23:38

 

 

처음에는 하.. 이걸 어떻게 풀어야 하나 생각했는데 보니까 N이 10개더라구요.

그래서 바로 브루트포스로 돌렸습니다!! ㅎㅎ

그러다가.. dfs로 돌리고 페일.. ㅠㅠ

그리고 bfs로 바꿔서 성공했습니다.

 

(나중에 알았지만, dfs도 풀 수 있는데 하... 제가 다 만들어 놓은 코드에서 합계 계산을 잘 못 했더라구요 ㅠㅠ 까빙..)

 

풀이 방법은 각각의 N-a와 a개의 도시 조합을 나누어서 브루트포스를 돌리면 됩니다.

dfs / bfs 방법 둘 다 가능한데, bfs가 쉽습니다... ㅎㅎ

bfs 추천 드릴게요!

 

코드:

from itertools import combinations

def bfs_com(x, cnt):
    global res1
    Q = connect.get(x)[:]
    while Q:
        tmpp = Q.pop()
        if visited[tmpp] and tmpp in com:
            visited[tmpp] = False
            Q.extend(connect.get(tmpp))
            cnt += arr[tmpp]
    if visited.count(False) == len(com):
        res1 = cnt

def bfs_tmp(x, cnt):
    global res2
    Q = connect.get(x)[:]
    while Q:
        tmpp = Q.pop()
        if visited[tmpp] and tmpp in tmp:
            visited[tmpp] = False
            Q.extend(connect.get(tmpp))
            cnt += arr[tmpp]
    if visited.count(False) == len(tmp):
        res2 = cnt

N = int(input())
arr = [0] + list(map(int, input().split()))
connect = dict()
for i in range(1, N+1):
    connect[i] = list(map(int, input().split()))[1:]

res = []

for i in range(1, N//2+1):
    for com in combinations(range(1, N+1), i):
        tmp = list(set(range(1, N+1))-set(com))
        res1, res2 = -1, -1
        visited = [True] * (N+1)
        visited[com[0]] = False
        bfs_com(com[0], arr[com[0]])
        visited = [True] * (N+1)
        visited[tmp[0]] = False
        bfs_tmp(tmp[0], arr[tmp[0]])
        if res1 != -1 and res2 != -1:
            res.append(abs(res1-res2))

if res:
    print(min(res))
else:
    print(-1)

반응형

'Study > BOJ' 카테고리의 다른 글

[BOJ] 19621. 회의실 배정 2  (0) 2021.02.04
[BOJ] 17135. 캐슬디펜스  (0) 2021.02.03
[BOJ] 1219. 오민식의 고민  (0) 2020.11.08
[BOJ] 9251. LCS  (0) 2020.11.06
[BOJ] 12865. 평범한 배낭  (1) 2020.11.06