def comb(cnt,idx,start): # 조합 찾기
# 현재 선택한 개수, p1의 값을 바꿔 줄 위치 값, 시작점
if cnt == find_num: # 현재 선택한 개수가 찾으려는 숫자와 같은 경우
cal(0)
return
else:
for q in range(start,n):
p1[idx] = q
comb(cnt+1,idx+1,q+1) # 선택한 개수 + 1, 위치 + 1, 시작점은 현재 값 + 1
return
def cal(p2_cnt): # 계산
global min_res
customer1 = 0 # 고객 1의 합
customer2 = 0 # 고객 2의 합
for w in range(n): # 고객 2의 재료 선택
if w not in p1:
p2[p2_cnt] = w
p2_cnt += 1
for i in range(n//2): # 계산하기, 홀수가 존재하기 때문에 하나씩 뽑아서 대조하면서 계산
# if n == 6이면 n//2 == 3이고, 두개씩 짝 지으면 한 개가 남아버림
for j in range(n//2):
if i != j: # 같은 값 제외 [1, 2]에서 1+1 같은 경우 배제하기 위함
customer1 += foods[p1[i]][p1[j]]
customer2 += foods[p2[i]][p2[j]]
if abs(customer1 - customer2) < min_res: # min_res보다 작으면 값 바꾸기
min_res = abs(customer1 - customer2)
return
T = int(input())
for tc in range(1,1+T):
n = int(input())
foods = [list(map(int,input().split())) for _ in range(n)] # 시너지 표
min_res = 20000 * n # 최소 값, 시너지 최대 값 * n
p1 = [0]*(n//2) # 1번 고객의 재료를 저장하기 위함
p2 = [0]*(n//2) # 2번 고객의 재료를 저장하기 위함
find_num = n//2 # 선택해야 할 개수
comb(0,0,0) # 현재 선택한 개수, p1의 값을 바꿔 줄 위치 값, 시작점
print('#{} {}'.format(tc, min_res))

 

그외

1. if min_res == 0 조건을 주면 조금이라도 더 시간 단축이 가능하지 않을까?

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.