For Programmer

백준 10971번 파이썬 문제풀이(브루트 포스 - 외판원 순회 2) 본문

코팅테스트/백준 문제 모음

백준 10971번 파이썬 문제풀이(브루트 포스 - 외판원 순회 2)

유지광이 2021. 10. 25. 18:37
728x90

코드

import sys

N = int(input()) #도시의 개수
travel_cost = [list(map(int, input().split())) for _ in range(N)]
min_value = sys.maxsize #출력할 최소값 정의


def dfs_backtracking(start, next, value, visited): #시작도시번호,다음도시번호,비용,방문 도시
    global min_value

    if len(visited) == N: #만약 방문한 도시가 입력받은 도시의 개수라면
        if travel_cost[next][start] != 0: #마지막 도시에서 출발 도시로 가는 비용이 0이 아니라면(즉,갈수 있다면)
            min_value = min(min_value, value + travel_cost[next][start]) #더한 값을 저장되어있는 최소값과 비교해서 대입
	return
    for i in range(N): #도시의 개수 만큼 반복문을 돈다.
        #만약 현재 도시에서 갈 수 있는 도시의 비용이 0이 아니고 이미 방문한 도시가 아니며 그 비용값이 저장되어있는 최소값보다 작다면
        if travel_cost[next][i] != 0 and i not in visited and value < min_value: 
            visited.append(i) #그 도시를 방문목록에 추가
            dfs_backtracking(start, i, value + travel_cost[next][i], visited) #그 도시를 방문한다.
            visited.pop() #방문을 완료했다면 방문목록 해제


#도시마다(0~3) 출발점을 지정
for i in range(N):
    dfs_backtracking(i, i, 0, [i])

print(min_value)

-> 이 문제에서 가장 어려운 부분이 재귀를 도는데 방문을 취소할 조건(백트래킹) if value < min_value 를 생각해 내는 것이다.그 이유는 이미 도시로 가는 비용이 저장되어있는 최소값보다 클 경우 굳이 방문할 필요가 없기 때문이다. 이 조건을 생각해내지 못한다면 시간초과가 계속 발생하기 때문에 조금 어려울 수 있다.

728x90
Comments