https://www.acmicpc.net/problem/14889
SOLUTION
조합으로 모든 팀 조합을 구해준 뒤, 각각의 팀 능력치를 생성해 비교하면 된다.
0~n까지 조합을 생성하여 리스트에 담으면 첫 조합의 여집합은 마지막 조합이다.
즉 team[i] 는 team[-i-1]과 완전히 반대된다. 이를 이용하여 풀면 쉽다.
PYTHON CODE
from itertools import combinations #조합 함수
N = int(input())
S = [list(map(int, input().split())) for _ in range(N)]
members = [i for i in range(N)]
possible_team = []
#조합으로 가능한 팀 생성해주기
for team in list(combinations(members, N//2)):
possible_team.append(team)
min_stat_gap = 10000 #갭이 가장 작은 값을 찾기 위하여
for i in range(len(possible_team)//2):
#A 팀
team = possible_team[i]
stat_A = 0 #A팀 능력치
for j in range(N//2):
member = team[j] #멤버
for k in team:
stat_A += S[member][k] #멤버와 함께할 경우의 능력치들
#A를 제외한 나머지 팀
team = possible_team[-i-1]
stat_B = 0
for j in range(N//2):
member = team[j]
for k in team:
stat_B += S[member][k]
min_stat_gap = min(min_stat_gap, abs(stat_A - stat_B))
print(min_stat_gap)
'Programming [Python] > 백준 알고리즘 솔루션' 카테고리의 다른 글
#323 백준 파이선 [3047] ABC (0) | 2020.01.06 |
---|---|
#322 백준 파이썬 [2789] 유학 금지 (0) | 2020.01.06 |
#320 백준 파이썬 [14888] 연산자 끼워넣기 (0) | 2020.01.05 |
#319 백준 파이썬 [14501] 퇴사 (0) | 2020.01.03 |
#318 백준 파이썬 [9465] 스티커 (0) | 2020.01.03 |