Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[프로그래머스] 여행경로 (Python3) 본문

Problem Solving

[프로그래머스] 여행경로 (Python3)

흑개 2021. 10. 17. 23:21

https://programmers.co.kr/learn/courses/30/lessons/43164

 

코딩테스트 연습 - 여행경로

[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]] ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]

programmers.co.kr

from collections import defaultdict, deque

def solution(tickets):
    answer = []
    neighbors=defaultdict(list)
    for start, end in tickets:
        neighbors[start].append(end)
    q=deque()
    q.append((["ICN"], 0, list(tickets)))
    while q:
        routes, cnt, temp_tickets=q.popleft()
        start=routes[-1]
        if (cnt==len(tickets)):             #다 돌았으면 answer 반환
            answer.append(routes)
        if neighbors.get(start) == None:    #start가 출발지인 항공권이 없는 경우
            continue
        for end in neighbors[start]:
            if [start, end] in temp_tickets: #쓰지 않은 ticket이 있을 경우
                temp_tickets.remove([start,end])
                q.append((routes+[end],cnt+1,list(temp_tickets)))
                temp_tickets.append([start,end])
    
    answer.sort()
    return answer[0]

엄청 헤매다.. 해답을 보았다. 자꾸 히든테케에서 걸렸다..

 

BFS 로 접근하는 방법을 취했다.

그리고 따로 visit 배열 만들어주지 않고 사용가능한 tickets 배열을 큐에 넣어 이를 체크하여 방문할 수 있도록 했다.

tickets의 길이만큼 방문했을 때, 그 routes를 answer에 넣어준다.

 

다른 분들의 코드를 보니 DFS로도 풀 수 있다.

쭉 DFS로 파고들어가다가 routes 의 길이가 N+1가 나오면 해당 route를 리턴하는 식이다. 이 경우에는 사전에 오름차순 정렬이 필요하다.