1. 조합을 직접 구현하여 해결한 풀이
| |
| def combination(idx, cnt, a_arr): |
| if cnt == n//2: |
| cal_diff(a_arr) |
| return |
| |
| for i in range(idx, n): |
| combination(i+1, cnt+1, a_arr+[i]) |
| |
| |
| |
| def cal_diff(a_arr): |
| global answer |
| |
| a, b = 0, 0 |
| b_arr = [i for i in range(n) if i not in a_arr] |
| for i in range(n//2-1): |
| for j in range(i+1, n//2): |
| a += synergy[a_arr[i]][a_arr[j]] + synergy[a_arr[j]][a_arr[i]] |
| b += synergy[b_arr[i]][b_arr[j]] + synergy[b_arr[j]][b_arr[i]] |
| |
| answer = min(answer, abs(a-b)) |
| |
| |
| tc = int(input()) |
| for idx in range(1, tc+1): |
| n = int(input()) |
| synergy = [list(map(int, input().split())) for _ in range(n)] |
| |
| answer = 9999999999 |
| combination(0, 0, []) |
| print('#{} {}'.format(idx, answer)) |
2. itertools의 combinations 사용한 풀이
| from itertools import combinations |
| |
| |
| tc = int(input()) |
| for idx in range(1, tc+1): |
| n = int(input()) |
| synergy = [list(map(int, input().split())) for _ in range(n)] |
| |
| answer = 9999999999 |
| for a_arr in combinations(range(n), n//2): |
| b_arr = [i for i in range(n) if i not in a_arr] |
| a, b = 0, 0 |
| for i in range(n // 2 - 1): |
| for j in range(i + 1, n // 2): |
| a += synergy[a_arr[i]][a_arr[j]] + synergy[a_arr[j]][a_arr[i]] |
| b += synergy[b_arr[i]][b_arr[j]] + synergy[b_arr[j]][b_arr[i]] |
| |
| answer = min(answer, abs(a - b)) |
| |
| print('#{} {}'.format(idx, answer)) |
3. itertools의 combinations, permutations 사용한 풀이
| from itertools import permutations, combinations |
| |
| |
| tc = int(input()) |
| for idx in range(1, tc+1): |
| n = int(input()) |
| synergy = [list(map(int, input().split())) for _ in range(n)] |
| |
| answer = 9999999999 |
| for a_arr in combinations(range(n), n//2): |
| b_arr = [i for i in range(n) if i not in a_arr] |
| a, b = 0, 0 |
| for i, j in permutations(a_arr, 2): |
| a += synergy[i][j] |
| |
| for i, j in permutations(b_arr, 2): |
| b += synergy[i][j] |
| |
| answer = min(answer, abs(a - b)) |
| |
| print('#{} {}'.format(idx, answer)) |