시냅스

백준 boj 15661 - 링크와 스타트 (파이썬, python) 본문

알고리즘

백준 boj 15661 - 링크와 스타트 (파이썬, python)

ted k 2022. 3. 1. 16:10

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

 

브루트포스백트래킹을 활용하여 풀었다.

가능한 조합을 모두 뽑아줘야 했지만,

시간제약의 관계로 dfs를 돌릴 때 for문을 쓰지 않는 방법으로 접근하였다.

조합을 뽑아 냈으면 start와 link로 나눠 차이를 구하고, 최소값을 갱신해줬다.

 

code

 

n = int(input())
stats = [list(map(int, input().split())) for i in range(n)]
visited = [0] * n
ans = 99999

def is_it():
    global ans
    start, link = 0, 0
    for i in range(n):
        for j in range(n):
            if visited[i] and visited[j]:
                start += stats[i][j]
            elif not visited[i] and not visited[j]:
                link += stats[i][j]
    ans = min(ans, abs(start - link))
    return

def resolve(iter):
    if iter == n:
        is_it()
        return
    visited[iter] = 1
    resolve(iter + 1)
    visited[iter] = 0
    resolve(iter + 1)
resolve(0)

print(ans)
Comments