여행경로 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/43164
Summary
DFS/BFS를 사용하여 해결하는 문제
주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.
항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
[제한사항]
[입출력 예]
tickets | return |
---|---|
[["ICN", "JFK"], ["HND", "IAD"], ["JFK", "HND"]] | ["ICN", "JFK", "HND", "IAD"] |
[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]] | ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"] |
- 혼자서 문제를 해결
- 힌트를 보고 해결
- 답을 보고 해결
def solution(tickets):
route = {}
for ap in tickets:
start, end = ap[0],ap[1]
route[start] = sorted(route.get(start,[]) + [end], reverse=True)
answer = []
stack = ['ICN']
while stack :
start = stack[-1]
if not start in route or route[start] == []:
answer.append(stack.pop())
else:
stack.append(route[start].pop(-1))
return answer[::-1]
from collections import defaultdict
def solution(tickets):
# 특정 티켓의 인접 리스트를 구하는 함수
def init_graph():
routes = defaultdict(list)
for key, value in tickets:
routes[key].append(value)
return routes
# 스택을 사용한 DFS
def dfs():
stack = ["ICN"]
path = [] # 가려고하는 경로를 저장하는 변수
while len(stack) > 0: # stack이 비어있을 때까지
top = stack[-1]
# 특정 공항에서 출발하는 표가 없다면 또는 있지만 티켓을 다 써버린 경우
if top not in routes or len(routes[top]) == 0:
path.append(stack.pop())
else:
stack.append(routes[top].pop(0))
return path[::-1]
routes = init_graph()
for r in routes:
routes[r].sort()
answer = dfs()
return answer
출처: 링크
모든 공항을 탐색하기 전에 경로가 끝나버리는 상황을 고려하지 못해 헤맸다.
결국 답을 보고 나서야 깨닫고 이해하는 시간을 가졌다.
해당 노드에 방문했는지 따로 체크를 안해줘도 경로를 역순으로 저장해주면 완전 탐색을 구현할 수 있다는 것을 배울 수 있었다.
문제 별로 유연하게 개념을 적용하는 연습이 필요하다.