백준 python 기록

백준 14889 파이썬 스타트와 링크

우히힝 2021. 10. 22. 20:01

백준 링크:https://www.acmicpc.net/problem/14889

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

 

 

dfs로 풀려했었는데 이해가 잘 안됐었다. 특히 예제 2번 6을 입력받았을떄 어떻게 해야하나 걱정했었는데

 

그냥 모든 조합을 구하면 되는거였다.

 

dfs로 visit 값을 구하면서 cnt가 만약 n//2값이 된다면 이중 for문을 작동시켜서 서로 짝일 경우에

start와 link 따로 계산해서 abs(start-link) (절대값)으로 계산했다.

n=int(input())
matrix=[]
for i in range(n):
    matrix.append(list(map(int,input().split())))

visited=[0 for i in range(n)]
result=[]

min_result=1000000000

def dfs(idx,cnt):
    global  min_result

    if cnt == (n//2):
        start,link = 0,0
        for i in range(n):
            for j in range(n):
                if visited[i] == 1 and visited[j] == 1:
                    start += matrix[i][j]
                elif visited[i] == 0 and visited[j] == 0:
                    link += matrix[i][j]
        min_result = min(min_result, abs(start-link))


    for i in range(idx,n):
        if visited[i] == 0:
            visited[i] = 1
            dfs(i+1 , cnt + 1)
            visited[i] = 0

dfs(0,0)
print(min_result)

 

만약 n == 4 일 경우의 수

첫번째 [1,1,0,0] 의 경우

matrix[0][1] , matrix[1][0] 이 짝

matrix[2][3],  matirx[3][2] 이 짝

 

 

n == 6 일 경우

첫번째 [1,1,1,0,0,0] 의 경우

matrix[0][1] , matrix[1][0], matrix[0][2], matrix[2][0] 이 짝

matrix[3][4],  matirx[4][3], matrix[3][5], matrix[5][3] 이 짝

따로 다 더하고 빼주면 끝