[Programmers 여행경로 : DFS/BFS, Python] - 스택 수열
2021, Oct 18
프로그래머스 LvL 3 : 여행경로
Solution
from collections import defaultdict
def solution(tickets):
graph = defaultdict(list)
for start, end in tickets:
graph[start].append(end) # 단일 방향
graph[start].sort(reverse = True) # 알파벳 오름차순으로 정렬
stack = ['ICN'] # 항상 출발은 인천공항
route = []
print(graph)
while stack:
cur = stack[-1]
if cur in graph and graph[cur]: # 해당 공항에서 출발하는 티켓이 남아있을 때
stack.append(graph[cur].pop()) # 사용한 ticket 은 pop, 공항 자체를 pop 시키는 게 아니라는 점이 포인트
else:
route.append(stack.pop()) # 최종 도착지(이 공항에서 출발하는 티켓이 없음)
route.reverse() # 도착한 순서대로 route 에 append 되기 때문에 reverse 를 시켜야 출발 -> 도착 여행경로가 됨
return route
풀이과정 및 느낀점
우선 이 문제는 연결된 공항을 우선적으로 다 지나야 하기 때문에 알고리즘 유형은 DFS 로 볼 수 있다.
stack 으로 풀었는데, 오히려 stack 으로 푸니 도착지부터 route 에 append 시켜줘야 해서 더 헷갈렸다. 차라리 일반적인 dfs 풀이처럼 재귀로 풀었으면 정지조건에서 append 시키도록 처리하면 되니 덜 까다로웠을 거 같다.
또 개인적으로 이 문제를 풀 때 신경써줘야 했던 건 방문한 공항이 아닌 그곳에서 사용한 티켓을 pop 시켜줘야 했던 부분이다.
공항 자체는 티켓으로 연결되어있기만 하면 재방문이 가능하기 때문에 방문했다고 해서 visited 처리하는 것처럼 없애버리면 안 된다.
도착지 -> 출발지 역순으로 route 에 추가되기 때문에 출력할 때는 reverse 시켜주는 것도 포인트이다.