- 문제 링크: https://leetcode.com/problems/number-of-good-leaf-nodes-pairs/
Medium 난이도 문제입니다. 그런데 어렵네요. 제 느낌은 Hard인듯.
일단 풀이부터 말하자면 leaf 노드들을 다 구해서 distance만큼만 탐색을 해보고 쌍을 찾으면 됩니다. 탐색은 bfs, dfs 뭐든 상관 없습니다만 dfs가 구현하기 더 쉽죠
문제는 그래프가 아니고 트리 노드 형식으로 입력이 주어지기 때문에 이걸 인접리스트 그래프로 바꿔주는 작업을 한번 했고요.. 여기서 참 dict가지고 씨름을 했습니다.
setdefault 보이시나요? 키값이 없으면 빈 리스트를 넣고 append를 하고, 키값이 있으면 그냥 append를 하는걸 if elif로 쓰면 너무 길고 이상해서 좀 찾아봤더니 저런 메소드가 있습니다..
class Solution(object):
def countPairs(self, root, distance):
# tree to graph
graph = {}
leaves = {}
queue = [(root, 0)]
while queue:
(current_node, idx) = queue.pop(0)
if not current_node.left and not current_node.right: # is leaf
leaves[idx] = True
graph.setdefault(idx, [])
else:
if current_node.left:
left_idx = idx * 2 + 1
graph.setdefault(idx, []).append(left_idx)
graph.setdefault(left_idx, []).append(idx)
queue.append((current_node.left, left_idx))
if current_node.right:
right_idx = idx * 2 + 2
graph.setdefault(idx, []).append(right_idx)
graph.setdefault(right_idx, []).append(idx)
queue.append((current_node.right, right_idx))
ret = 0
for leaf in leaves:
ret += self.dfs(graph, leaves, distance, leaf, 0, {})
return ret / 2
def dfs(self, GRAPH, LEAVES, DISTANCE, current_idx, current_depth, visited):
visited[current_idx] = True
if current_depth > DISTANCE:
return 0
if current_depth is not 0 and current_idx in LEAVES:
return 1
ret = 0
for nxt in GRAPH[current_idx]:
if nxt not in visited:
ret += self.dfs(GRAPH, LEAVES, DISTANCE, nxt, current_depth+1, visited)
return ret
discussion 탭을 봤더니 뭔가 더 좋은 아이디어로 풀이를 써놓은게 많던데.. 전 잘 모르겠습니다.. 여기까지만 하는걸로;
반응형
'Online Judge > LeetCode' 카테고리의 다른 글
[LeetCode][Python] 217. Contains Duplicate (0) | 2024.09.07 |
---|---|
[LeetCode][Python] 875. Koko Eating Bananas (0) | 2020.12.22 |
[LeetCode][Python] 797. All Paths From Source to Target (0) | 2020.12.08 |
[LeetCode][Python] 1315. Sum of Nodes with Even-Valued Grandparent (0) | 2020.11.11 |
[LeetCode][Python] 111. Minimum Depth of Binary Tree (0) | 2020.11.11 |