본문 바로가기
백준/실버 1

14889번 - 스타트와 링크(Python)

by 김주현3902 2025. 2. 7.

풀이

백트래킹을 이용해 나눌 수 있는 팀의 경우의 수를 모두 구한다.

 

우선, status[i][j]에 status[j][i]를 더했다. 따라서 status[i][j]는 i와 j가 팀이 되었을 때 더해지는 능력치의 합이 되었다.(i < j)

 

이후에 스타트 팀에 0을 고정한 상태로, 스타트 팀에 들어갈 N//2 - 1 명을 백트래킹을 이용해 배정한다.

(0이 링크 팀에 들어가는 경우는 스타트 팀에 들어가는 것과 대칭되므로 스타트팀에 속하는 경우만 계산한다.)

이후에 스타트 팀에 속하지 않은 N//2 명을 링크 팀에 배정한 후 각 팀의 점수를 구해 두 팀의 점수차의 절댓값을 ans에 넣는다.

백트래킹이 끝난 후 ans의 최솟값을 정답으로 출력한다.

코드

N = int(input())

status = [list(map(int, input().split())) for _ in range(N)]

for i in range(N-1):
    for j in range(i+1, N):
        status[i][j] += status[j][i]

start = [0]
ans = []
visited = [False for _ in range(N)]


def dfs(first):
    if len(start) == N//2:
        link = []
        for i in range(N):
            if i not in start:
                link.append(i)
        score_start = 0
        score_link = 0

        for i in range(N//2):
            for j in range(i+1, N//2):
                score_start += status[start[i]][start[j]]
                score_link += status[link[i]][link[j]]
        ans.append(abs(score_start-score_link))
        return

    for i in range(first+1, N):
        if not visited[i]:
            start.append(i)
            visited[i] = True
            dfs(i)
            start.pop()
            visited[i] = False


dfs(0)
print(min(ans))

 

'백준 > 실버 1' 카테고리의 다른 글

2468번 - 안전 영역(Python)  (0) 2025.02.07
1991번 - 트리 순회(Python)  (0) 2025.02.05
14888번 - 연산자 끼워넣기(Python)  (0) 2025.02.04
10844번 - 쉬운 계단 수(Python)  (0) 2025.01.25
2156번 - 포도주 시식(Python)  (0) 2025.01.25