백준_14889_스타트와 링크

임정민·2023년 1월 4일
3

알고리즘 문제풀이

목록 보기
13/173
post-thumbnail

코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67

문제

https://www.acmicpc.net/problem/14889
[나의 풀이]

# PyPy3 용
# combinations 사용

if __name__ == "__main__":
    import sys
    input = sys.stdin.readline
    from itertools import combinations
    import math

    n = int(input())
    S = [list(map(int, input().split())) for _ in range(n)]

    people = [i for i in range(1,n+1)]

    team_start = []
    team_link = []

    min_diff = 10*100*2-10*1*2 # 팀간 점수의 최댓값
    diff = 0

    for team_start in list(list(combinations(people,int(n/2)))):
        start_score = 0
        link_score = 0
        team_link = list(set(people) - set(team_start)) 
        # list() - list()가 안됌. set으로 바꾸어 뺌.
    
        for j in range(0,len(team_start)):
            for k in range(j+1,len(team_start)):
                start_score += S[team_start[j]-1][team_start[k]-1]
                start_score += S[team_start[k]-1][team_start[j]-1]
            
                link_score += S[team_link[j]-1][team_link[k]-1]
                link_score += S[team_link[k]-1][team_link[j]-1]

        diff = int(abs(start_score - link_score))
    
        if diff == 0:
            print(diff)
            break
    
        if min_diff >= diff:
            min_diff = diff
        
    if diff != 0:
        print(min_diff)

[팀원의 풀이1]

def recursiveDef(startCase, currentPeopleNum):
    
    global peopleNum ,currentTeam ,Dif, totalScore
    
    if currentPeopleNum == peopleNum // 2 :
        teamScore = 0
        
        for i in range(peopleNum):
            if currentTeam[i] :
                teamScore += totalScorePerPerson[i]
            
        Dif.append(int(abs(totalScore - teamScore)))
            
        return
    
   
    for i in range(startCase, peopleNum):
        currentTeam[i] = True;
        recursiveDef(i+1, currentPeopleNum+1)
        currentTeam[i] = False;
        
    return
        

import sys

peopleNum = int(input())
scoreBoard = [list(map(int,sys.stdin.readline().strip().split())) for _ in range(peopleNum)]


totalScorePerPerson = []
Dif = []
totalScore = 0

for i in range(peopleNum):
    scorePerPerson = 0
    for j in range(peopleNum):
        scorePerPerson += scoreBoard[i][j] +scoreBoard[j][i]
        totalScore += scoreBoard[i][j]
        
    totalScorePerPerson.append(scorePerPerson)



currentTeam = [False for _ in range(peopleNum)]
currentTeam[0] = True

recursiveDef(1,1) 

minDif = min(Dif)

print(f'{minDif}')  
profile
https://github.com/min731

0개의 댓글