주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 ICN 공항에서 출발합니다.
항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
[ICN, JFK, HND, IAD] 순으로 방문할 수 있습니다.
[ICN, SFO, ATL, ICN, ATL, SFO] 순으로 방문할 수도 있지만 [ICN, ATL, ICN, SFO, ATL, SFO] 가 알파벳 순으로 앞섭니다.
import copy
def _search(left_tickets, ticket_history, result):
for ticket in left_tickets:
if ticket_history[-1][1] == ticket[0]:
if len(left_tickets) > 1:
added_history = copy.deepcopy(ticket_history)
added_history.append(ticket)
_search(copy.deepcopy([x for x in left_tickets if x is not ticket])
, added_history
, result)
elif len(left_tickets) == 1:
ticket_history.append(ticket)
result.append(ticket_history)
def solution(tickets):
answer = []
result = []
for ticket in tickets:
if ticket[0] == 'ICN':
left_tickets = copy.deepcopy([x for x in tickets if x is not ticket])
_search(left_tickets, [ticket], result)
for seq in result:
path = []
for index, ticket in enumerate(seq):
if index == 0:
path.extend(ticket)
else:
path.append(ticket[1])
answer.append(path)
answer = sorted(answer, key = lambda x: x)
return answer[0]
_search(left_tickets, ticket_history, result)
는 solution(tickets)
에서 내부적으로 호출되는 함수이다. 깊이 우선 탐색 방식을 통해 가능한 모든 경로를 찾는다. 인자는 아래와 같다.
left_tickets : 아직 사용하지 않은 티켓의 리스트
ticket_history : 현재까지 거쳐온 경로
result : 모든 티켓을 사용하였을 경우 가능한 모든 경로를 저장하는 list
solution
에서 'ICN'에서 출발하는 티켓들만 시작점으로 주어 _search
를 호출한다.
_search
에서는 가장 마지막 경로의 도착점과 남은 티켓들의 출발지를 확인하여 두 위치가 동일한 경우 ticket_history와 left_tickets에 각각 추가, 삭제한 후에 다시 _search
를 재귀호출한다. 이 때, 만약 남은 티켓이 해당 티켓밖에 없는 경우 해당 티켓을 ticket_history에 추가한 후, 해당 ticket_history를 result에 추가한다. 위 과정을 통해 가능한 모든 경로를 result에 추가한다.
_search
의 재귀호출이 모두 끝난 후에 solution
에서 result를 확인하여 일련의 경로로 바꾼다. 이후 알파벳 순으로 정렬하여 가장 첫번째 원소를 리턴한다.