import itertools
n = int(input())
abilities = [list(map(int, input().split())) for _ in range(n)]
min_diff = float('inf') # 능력치 차이의 최솟값
for team_a in itertools.combinations(range(n), n//2):
team_b = list(set(range(n)) - set(team_a)) # team_a의 집합 차집합
sum_a = sum(abilities[i][j] + abilities[j][i] for i, j in itertools.combinations(team_a, 2))
sum_b = sum(abilities[i][j] + abilities[j][i] for i, j in itertools.combinations(team_b, 2))
min_diff = min(min_diff, abs(sum_a - sum_b))
print(min_diff)
코드 리뷰
1. import itertools: itertools 모듈을 불러오기. 반복자(iterator)를 만드는 함수들을 포함하고 있다.
2. n = int(input()): 입력으로 플레이어의 수 n을 받기.
3. abilities = [list(map(int, input().split())) for _ in range(n)]: n명의 플레이어의 능력치 정보를 입력받아 이차원 리스트인 abilities에 저장.
4. min_diff = float('inf'): 초기값으로 min_diff 변수에 양의 무한대 값을 할당.
5. for team_a in itertools.combinations(range(n), n//2):: itertools.combinations() 함수를 사용하여 가능한 모든 팀 조합을 생성. range(n)에서 n//2개를 선택하는 조합을 생성하여 team_a에 할당.
6. team_b = list(set(range(n)) - set(team_a)): team_a의 요소를 제외한 나머지 요소들로 이루어진 리스트 team_b를 생성.
7. sum_a = sum(abilities[i][j] + abilities[j][i] for i, j in itertools.combinations(team_a, 2)): team_a의 각 플레이어 쌍의 능력치 합을 계산.
8. sum_b = sum(abilities[i][j] + abilities[j][i] for i, j in itertools.combinations(team_b, 2)): team_b의 각 플레이어 쌍의 능력치 합을 계산.
9. min_diff = min(min_diff, abs(sum_a - sum_b)): sum_a와 sum_b의 차이의 절댓값을 계산하여 min_diff와 비교하여 더 작은 값을 min_diff에 할당.
10. print(min_diff): 능력치 차이의 최솟값을 출력.