For Programmer
백준 10971번 파이썬 문제풀이(브루트 포스 - 외판원 순회 2) 본문
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
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 1182번 파이썬 문제풀이(브루트 포스 - 부분수열의 합) (0) | 2021.10.26 |
---|---|
백준 6603번 파이썬 문제풀이(브루트 포스 - 로또) (0) | 2021.10.26 |
백준 10819번 파이썬 문제풀이(브루트 포스 - 차이를 최대로) (0) | 2021.10.24 |
백준 10973번 파이썬 문제풀이(브루트 포스 - 모든 순열) (0) | 2021.10.24 |
백준 10974번 파이썬 문제풀이(브루트 포스 - 모든 순열) (0) | 2021.10.24 |
Comments