출처 : 파이썬 알고리즘 인터뷰
오늘은 어제의 자신감으로 특별히 두 문제를 풀어보았다.
딱 봐도, 부분집합 구하는 문제이다.
개념도 간단하고 사실 풀고나서 보면 답도 간단한데, 못 풀었다.
요소 추가할 때마다 result에 append하는 로직
def dfs(index, path):
result.append(path)
for i in range(index, len(nums)):
dfs(i+1, path+[nums[i]])
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
result = []
def dfs(index, path):
result.append(path)
for i in range(index, len(nums)):
dfs(i+1, path+[nums[i]])
dfs(0, [])
return result
leetcode 332.ReconstructItinerary
이 문제는 약간의 해설 도움을 받았으나, 기억을 되살려 그래도 어찌저찌 비벼볼 수 있었던 문제였다.
[출발지, 도착지]의 여정이 적힌 tickets가 주어지고, JFK에서 시작하는 여정을 반환하는 문제.
방향이 있네? -> 그래프로 저장해봐야겠다
-> 도착지를 dfs 매개변수로 보내서 출발지로 이용하는 로직 어떤데.
사전배열식의 순서로? -> 문자열 정렬해야겠네
그래프로 저장하기
dictionary인데 값을 list로 저장하는 형식의 방향 그래프를 만들어보겠다.
graph = collections.defaultdict(list)
for f, t in tickets:
graph[f].append(t)
graph[f].sort(reverse=True) # pop해서 쓸 것이기 때문에 내림차순
dfs 작성
def dfs(f):
while graph[f]:
dfs(graph[f].pop())
path.append(f) # dfs가 끝날 때 '출발지'를 append => 거꾸로 저장됨
거꾸로 저장되었을테니까 거꾸로 반환
return path[::-1]
class Solution:
def findItinerary(self, tickets: List[List[str]]) -> List[str]:
graph = collections.defaultdict(list)
path = []
for f, t in tickets:
graph[f].append(t)
graph[f].sort(reverse=True)
def dfs(f):
while graph[f]:
dfs(graph[f].pop())
path.append(f)
dfs("JFK")
return path[::-1]