Notion에서 작성한 글이라, 여기에서 더 깔끔하게 보실 수 있습니다! 😮😊
tickets
의 길이를 이라 할 때, 탐색중인 경로의 길이가 이란 것은 모든 티켓을 사용했다는 의미이다.
from collections import defaultdict
def solution(tickets):
adj = defaultdict(list)
for u, v in tickets:
adj[u].append([v, False])
ret = []
def backtracking(cur, path=["ICN"]):
if len(path) == len(tickets) + 1:
ret.append(path[:])
return
for nxt in adj[cur]:
if not nxt[1]:
nxt[1] = True
path.append(nxt[0])
backtracking(nxt[0], path)
path.pop()
nxt[1] = False
backtracking('ICN')
return min(ret)
tickets
를 순회하며 인접 리스트를 구성한다. 이 때, 항공권의 사용 처리(방문 처리)를 위해 이를 나타낼 변수를 False
로 초기화하여 함께 묶어 놓는다.ret
에는 가능한 모든 경로들이 모여있게 된다. 알파벳 순서가 앞서는(사전 순으로 가장 앞서는) 경로를 return하기 위해 min(ret)
으로 return한다.from collections import defaultdict
def solution(tickets):
adj = defaultdict(list)
for u, v in sorted(tickets):
adj[u].append([v, False])
def backtracking(cur, path=["ICN"]):
if len(path) == len(tickets)+1: return path
for nxt in adj[cur]:
if not nxt[1]:
nxt[1] = True
path.append(nxt[0])
if ret:= backtracking(nxt[0], path): return ret
path.pop()
nxt[1] = False
return backtracking('ICN')
path
는 알파벳 순서가 가장 앞서는 경로이다.from collections import defaultdict
def solution(tickets):
adj = defaultdict(list)
for u, v in sorted(tickets, reverse=True):
adj[u].append(v)
stack = ["ICN"]
ret = []
while stack:
if adj[stack[-1]]:
nxt = adj[stack[-1]].pop()
stack.append(nxt)
else:
ret.append(stack.pop())
return ret[::-1]
from collections import defaultdict
def solution(tickets):
adj = defaultdict(list)
for u, v in sorted(tickets, reverse=True):
adj[u].append(v)
ret = []
def traversal(cur):
while adj[cur]:
traversal(adj[cur].pop())
ret.append(cur)
traversal("ICN")
return ret[::-1]
References