주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "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"] |
예제 #1
["ICN", "JFK", "HND", "IAD"] 순으로 방문할 수 있습니다.
예제 #2
["ICN", "SFO", "ATL", "ICN", "ATL", "SFO"] 순으로 방문할 수도 있지만 ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"] 가 알파벳 순으로 앞섭니다.
❔ - Kruskal 알고리즘이란? - 참고 : Heee's Development Blog
def solution(tickets):
answer = []
routes = {}
for t1, t2 in tickets:
if t1 in routes:
routes[t1].append(t2)
else:
routes[t1] = [t2]
for r in routes.values():
r.sort(reverse=True)
st = ["ICN"]
answer = []
while st:
top = st[-1]
if top not in routes or len(routes[top]) == 0:
answer.append(st.pop())
else:
st.append(routes[top][-1])
routes[top] = routes[top][:-1]
return answer[::-1]
step 1
routes = {}
for t1, t2 in tickets:
if t1 in routes:
routes[t1].append(t2)
else:
routes[t1] = [t2]
for r in routes.values():
r.sort(reverse=True)
✅
routes = {}
- 각 출바지에서 갈 수 있는 다음 경로로 갈 수 있는 위치를
[]배열에 저장# routes = { # 'ICN': ['SFO', 'ATL'], # 'SFO': ['ATL'], # 'ATL': ['ICN', 'SFO'] # }
✅
r.sort(reverse=True)
- 다음경로를 대문자 알파벳 기준 내림차순 정렬
- 경로가 1개 이상일 때 알파벳 기준을 먼저 pop() 할 경로를 위한 배열 정렬
# routes = { # 'ICN': ['SFO', 'ATL'], # 'SFO': ['ATL'], # 'ATL': ['SFO', 'ICN'] # }
step 2
st = ["ICN"]
answer = []
while st:
top = st[-1]
if top not in routes or len(routes[top]) == 0:
answer.append(st.pop())
else:
st.append(routes[top][-1])
routes[top] = routes[top][:-1]
return answer[::-1]
✅
st = ["ICN"]
- 시작점은 항상 "ICN"
✅
if top not in routes or len(routes[top]) == 0:
- 다음경로가 없을 때 st에서 빼며 answer 경로에 append
- 다음경로가 없을 경우 && 모든 항공권을 아직 사용하지 않았을 경우 : 마지막 경로 조건
✅
else:
- 안에 경로가 있을때 경로를
st에 추가
✅
return answer[::-1]
answer배열은 경로의 역순으로 저장되었기 떄문에 역정렬 값 return