// education

20. 비트마스킹(Bitmasking)과 외판원 순회 문제(TSP: Traveling Salesperson Problem)

정수의 비트(Bit)를 이용하여 집합의 방문 상태를 효율적으로 표현하는 **비트마스킹(Bitmasking)**과 **외판원 순회 문제(TSP)**의 DP 조합 기법을 다룹니다.


4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설

본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.

def tsp(n: int, W: list) -> int:
    """비트마스크 + DP 기반 외판원 순회 문제 (O(N^2 * 2^N))"""
    INF = float('inf')
    dp = {}

    def visit(curr: int, visited: int) -> int:
        # [Base Case] 모든 도시를 방문 완료한 경우 (비트마스크가 모두 1)
        if visited == (1 << n) - 1:
            return W[curr][0] or INF  # 시작 도시(0)로 돌아가는 비용 반환

        # 메모이제이션 캐시 확인
        if (curr, visited) in dp:
            return dp[(curr, visited)]

        min_cost = INF
        for next_city in range(n):
            # 1. 아직 방문하지 않았고 (visited & (1 << next_city) == 0)
            # 2. 이동 가능한 길(W[curr][next_city] != 0)인 경우
            if not (visited & (1 << next_city)) and W[curr][next_city] != 0:
                cost = W[curr][next_city] + visit(next_city, visited | (1 << next_city))
                min_cost = min(min_cost, cost)

        dp[(curr, visited)] = min_cost
        return min_cost

    return visit(0, 1)  # 0번 도시에서 방문 시작(visited = 1)

if __name__ == "__main__":
    W = [
        [0, 10, 15, 20],
        [10, 0, 35, 25],
        [15, 35, 0, 30],
        [20, 25, 30, 0]
    ]
    print("TSP 최단 순회 비용:", tsp(4, W))

파이썬 소스 코드 핵심 포인트 해설

  1. visited | (1 << next_city): 비트 연산자를 사용하여 도시 방문 상태를 정수 하나로 압축 및 메모이제이션합니다.

5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)

20. 비트마스킹(Bitmasking)과 외판원 순회 문제(TSP: Traveling Salesperson Problem) 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

1) 공간/시간 복잡도 한계 및 메모리 사용 제어

2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트

  1. 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
  2. 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.

6. 핵심 요약 및 실무 FAQ (Summary & Q&A)

Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?

Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?

← 이전19. 구간 쿼리 자료구조 - 세그먼트 트리(Segment Tree) 및 느리게 갱신되는 세그먼트 트리 다음 →