두 팀의 조합을 전부 순회하며 팀별 합의 차 탐색
알고리즘: Brute Force
import sys
from itertools import combinations
input = sys.stdin.readline
n = int(input())
g = [list(map(int, input().split())) for _ in range(n)]
p = [i for i in range(n)]
ret = 10000 # 최대로 날 수 있는 차
t = list(combinations(p, n//2)) # 전체 조합 경우
c = len(t)
k = 0
for t1 in t:
if k == c / 2: # 조합 길이의 절반만 탐색
break
s = 0
l = 0
t2 = list(set(p) - set(t1)) # t1의 차집함으로 두번째 팀 리스트 만들기
for i in list(combinations(t1, 2)): # t1에서 다시 팀원 조합
s += g[i[0]][i[1]] 능력치 합산
s += g[i[1]][i[0]]
for i in list(combinations(t2, 2)): # t2에서 다시 팀원 조합
l += g[i[0]][i[1]]
l += g[i[1]][i[0]]
tmp = abs(s - l) # 능력치 차이 계산
if tmp < ret: # 능력치 차가 최소일 때 갱신
ret = tmp
k += 1
print(ret)
이번 문제는 조합을 사용하며 풀면 쉽게 풀 수 있는 문제였다
다만 조합으로 한 팀의 구성원을 선택할 경우 그의 차집합이 되는 두번째 팀을 구하는 방식을 잘 모르겠어서 냅다 for문을 돌리다 이건 아닌 거 같아서 방법을 찾게 되었는데
t2 = list(set(p) - set(t1))
과 같은 방식으로 구할 수 있었다
이렇게도 list를 만들 수 있다니 그저 신기!
그리고 전체 조합 경우 t에서 먼저 선택 된 t1의 차집합이 t2다 보니
나는 t 길이의 절반만 순회하도록 k라는 변수를 따로 두었는데
for i in range(len(t) // 2):
t1 = t[i]
t2 = t[-i-1]
과 같이 구하는 방식도 나중에 알게 되었다
아주 깔끔한 듯!