-
[백준] 10971번 외판원 문제 2 (by Python)Programming/Algorithm 2021. 1. 31. 16:13
문제
문제의 구성이 기본적인 측면이 있어 사전지식 없이 아이디어를 떠올려 풀 수 있었으나 더 나은 해법을 찾던 중 해당 문제가 TSP(Traveling Salesperson Problem)라는 유명한 문제라는 것을 알았고, 관련된 알고리즘을 체계적으로 공부해보는 계기가 되었다. 덕분에 비트 연산 및 Dynamic Programming 방법에 대해 생각해볼 수 있어서 좋았다.
풀이
def isIn(i, A): return (A & (1 << (i - 1))) != 0 def diff(A, j): t = 1 << (j - 1) return A & (~t) def minimum(w, D, i, A): min_val = INF for j in range(1, n): if isIn(j, A): m = w[i][j] + D[j][diff(A, j)] min_val = min(min_val, m) return min_val def travel(n, w): size = 2 ** (n - 1) D = [[0] * size for _ in range(n)] for i in range(1, n): D[i][0] = w[i][0] for k in range(1, n - 1): for A in range(1, size - 1): if bin(A).count('1') == k: for i in range(1, n): if not isIn(i, A): D[i][A] = minimum(w, D, i, A) A = size - 1 return minimum(w, D, 0, A) INF = int(1e9) n = int(input()) w = [] for _ in range(n): w.append([INF if m == 0 else m for m in list(map(int, input().split()))]) print(travel(n, w))
참고
위 풀이를 위해 참고한 영상이다. TSP에 대해 더 궁금하시다면 한 번 보는 걸 권한다.
'Programming > Algorithm' 카테고리의 다른 글
[백준] 14226번 이모티콘 (by Python) (0) 2021.02.07 [백준] 1707번 이분 그래프 (by Python) (0) 2021.02.06 [백준] 9019번 DSLR (by Python) (0) 2021.01.29 [백준] 10972번 다음 순열 (by Python) (0) 2021.01.27 [백준] 14500번 테트로미노 (by Python) (5) 2021.01.26