Posts [알고리즘] 프로그래머스 - 여행경로
Post
Cancel

[알고리즘] 프로그래머스 - 여행경로


문제

주어지는 항공권을 모두 이용하여 여행경로 짜기
출발점은 항상 “ICN”
주어지는 공항 수는 3개 이상 10,000개 이하
tickets의 각 행 [a, b]는 a공항에서 b 공항으로 가는 항공권
주어지는 항공권을 모두 사용해야함.
가능한 경로가 2개 이상일 경우 알파벳 순서
모든 도시를 방문할 수 없는 경우는 주어지지 않음


입출력 예시

ticketsreturn
[[“ICN”, “JFK”], [“HND”, “IAD”], [“JFK”, “HND”]][“ICN”, “JFK”, “HND”, “IAD”]


접근

일반적인 그래프의 DFS, BFS 문제는 모든 정점을 방문하는 것을 기준으로 한다.
이 문제는 조금 다르게 주어지는 모든 간선을 사용하는 것이 목적이다.
DFS를 이용하여 남은 간선을 계속 따라가는 식으로 구현하면 될 것같다.
하지만 여기서 문제는 단순히 DFS를 이용하면 더 이상 남은 간선이 없을 때 이전 정점으로 돌아오는 부분인데,
이 문제에서는 그 부분이 해당 간선이 없으면 불가능하다.
따라서 진행이 막히는 경로는 따로 저장을 해두고 나머지 경로를 모두 탐색한 후 마지막에 추가해주는 식으로 하면 해결할 수 있을 것 같다.


코드

  • 파이썬 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(tickets):
    routes = {}
    for t in tickets:
        routes[t[0]] = routes.get(t[0], []) + [t[1]]
    for r in routes:
        routes[r].sort(reverse=True)
    stack = ["ICN"]
    path = []
    while len(stack) > 0:
        now = stack[-1]
        if now not in routes or len(routes[now]) == 0:
            path.append(stack.pop())
        else:
            stack.append(routes[now][-1])
            routes[now] = routes[now][:-1]
    path.reverse()
    return path


This post is licensed under CC BY 4.0 by the author.

[알고리즘] 프로그래머스 - N으로 표현

데이터베이스 정리 3 - 무결성 제약조건