Python
(python) 14889 스타트와 링크
휘휘o
2020. 6. 23. 12:19
백트래킹 문제
백트래킹으로 경우의 수를 뽑아 정답을 찾아내는 문제다.
python의 경우 combination 함수를 제공해주기 때문에 편리하게 구현할 수 있다.
알고리즘
1. combination으로 팀을 나눈다. - 뽑아진 인덱스를 전부 탐색하면 중복 탐색이 되기 때문에 절반만 사용한다.
2. 뽑힌 인덱스, 안뽑힌 인덱스끼리 팀을 맻는다.
3. 각 팀별 2개의 조합을 뽑아준다. [1,2,3]일 경우 [1,2],[1,3],[2,3]
4. reduce함수를 이용해 능력치 합을 구한다.
5. 각 팀별 능력치 합의 차이를 결과에 append 한다.
6. 결과의 최소값 출력
import itertools
import sys
from functools import reduce
input = sys.stdin.readline
N = int(input())
li = [list(map(int, input().rstrip().split())) for _ in range(N)]
team = list(itertools.combinations(range(N),(N//2)))
team = team[:int(len(team)/2)]
result = []
def teamStateSum(teamindex):
x = teamindex[0]
y = teamindex[1]
return li[x][y] + li[y][x]
def teamReduce(teamCombi):
result = (reduce(
lambda x, y : (x + y), (teamStateSum(i) for i in teamCombi)
))
return result
def teamCombiList(t):
r = teamReduce(list(itertools.combinations(t, 2)))
return r
for i in team:
teamB = [j for j in range(N)]
for j in i:
teamB.remove(j)
result.append(abs(teamCombiList(i) - teamCombiList(teamB)))
print(min(result))