from itertools import combinations
n =int(input())
matrix=[i for i in range(n)]
cases = list(combinations(matrix,int(n//2))) #절반만 팀짜면 나머지 자동팀 생성
for i in range(n):
matrix[i] = list(map(int,input().split()))
minValue = 100*n*n #행렬 1개의 cell값은 100을 넘지 않음
for aTeam in cases: #cases의 첫번째 요소
totalA = 0
totalB = 0
for x in aTeam:
for y in aTeam:
totalA+=matrix[x][y]
bTeam = [x for x in range(n) if x not in aTeam] #aTeam에 있지 않는 사람들로 구성
for x in bTeam:
for y in bTeam:
totalB+=matrix[x][y]
minValue = min(minValue,abs(totalA-totalB))
print(minValue)
어우.. 빡쌔다..
아무리 생각해도 생각이 안나서
14889 해설
을 참고했다...
조합을 사용하는 문제이다.
우선, n을 입력받고 matrix를 생성 해주는데 이는 팀원 이름이라고 생각하면 된다. matrix로 부터 cases를 생성해 조합을 만들어준다.
그 후 matrix를 새로 입력 받아 팀원별 능력치를 입력받는다.
여기까지가 입력이다
그리고
행렬 1개의 cell값은 100을 넘지 않는다 하여 minValue = 100n^2으로 최솟값을 설정해주었다.
이후 조합별로 합을 비교해가는것인데 어떤 생각에 기초했냐면 하나의 팀이 선택되면 나머지는 자동으로 정해진다는 것이다.
당연하다. n명을 2로 나눈것이 한 팀이니 한 팀만 정하면 나머지 팀은 정해진다.
그렇기에 aTeam을 먼저 받고
aTeam의 팀원 능력치 합을 for문을 돌면서 totalA에 입력 받는다
그러고 나머지 팀은 처음에 matrix생성과 같이 팀원이름을 새로 할당받는데 대신 aTeam제외한 팀원이다.
그렇기에 bTeam이 선정되어
이 bTeam또한 for문을 돌면서 팀원 능력치 합을 구한다.
그리고 마지막 에 minValue를 min함수를 사용해서 최솟값을 초기화 해나가며 for문을 반복한다.