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