기록

백준_15661_링크와 스타트 본문

코딩테스트/python

백준_15661_링크와 스타트

youngyin 2022. 5. 3. 12:29

문제

https://www.acmicpc.net/problem/15661

 

15661번: 링크와 스타트

첫째 줄에 N(4 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 S가 주어진다. 각 줄은 N개의 수로 이루어져 있고, i번 줄의 j번째 수는 Sij 이다. Sii는 항상 0이고, 나머지 Sij는 1보다 크거나 같고, 100

www.acmicpc.net

풀이

1. make team

팀1이 가질수 있는 선수들의 경우의 수를 구한다.

선수의 수를 n//2로 둔 이유는 중복을 제거하기 위해서이다. (아래 두 경우를 같게 취급)

team1 team1 team1 team2 team1 team1 team2
team2 team2 team2 team1 team2 team2 team1

2. calculation diff ability

두팀의 능력값을 계산해 차이를 구한다.

코드

import sys
from itertools import combinations
input = sys.stdin.readline

N = int(input().strip())
board = [list(map(int, input().strip().split())) for i in range(N)]

# 2. calculation diff ability
def getAbility(selection) :
    ability = 0
    for i in range(N) : 
        for j in range(i, N) :
            it = board[i][j]+board[j][i]
            isTeam1 = selection[i]==True and selection[j]==True
            isTeam2 = selection[i]==False and selection[j]==False
            ability += it*isTeam1 - it*isTeam2
    return abs(ability)

# 1. make team
ans = float('INF')
for np in range(N//2) :
    combi = list(combinations(range(N), np+1))
    for playerList in combi : 
        selection = [False, ]*N
        for player in playerList : 
            selection[player] = True
        ans = min(ans, getAbility(selection))
        

print(ans)
Comments