파이썬 54

[파이썬 알고리즘 인터뷰][트리] 최소 높이 트리

이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 문제 정의 그래프의 최소 신장 트리가 되는 루트 출력 책에서 구현된 코드 class Solution: def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]: if n 2: n -= len(leaves) new_leaves = [] for leaf in leaves: neighbor = graph[leaf].pop() graph[neighbor].remove(leaf) if len(graph[neighbor]) == 1: new_leaves.append(neighbor) leaves = new_leaves return leaves 기억해야할 ..

책읽기 2021.08.04

[파이썬 알고리즘 인터뷰][트리] 균형 이진 트리

이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 문제 정의 로그 재정렬 기준 책에서 구현된 코드 class Solution: def isBalanced(self, root: TreeNode) -> bool: def check(root): if not root: return 0 left = check(root.left) right = check(root.right) # 높이 차이가 나는 경우 -1, 이외에는 높이에 따라 1 증가 if left == -1 or \ right == -1 or \ abs(left - right) > 1: return -1 return max(left, right) + 1 return check(root) != -1 기억해야할 기법 DFS에..

책읽기 2021.08.03

[파이썬 알고리즘 인터뷰][트리] 이진 트리 직렬화 & 역직렬화

이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 문제 정의 직렬화 / 역직렬화 구현 책에서 구현된 코드 class Codec: # 직렬화 def serialize(self, root: TreeNode) -> str: queue = collections.deque([root]) result = ['#'] # 트리 BFS 직렬화 while queue: node = queue.popleft() if node: queue.append(node.left) queue.append(node.right) result.append(str(node.val)) else: result.append('#') return ' '.join(result) # 역직렬화 def deserializ..

책읽기 2021.08.03

[파이썬 알고리즘 인터뷰][트리] 두 이진 트리 병합

이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 문제 정의 로그 재정렬 기준 책에서 구현된 코드 class Solution: def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode: if t1 and t2: node = TreeNode(t1.val + t2.val) node.left = self.mergeTrees(t1.left, t2.left) node.right = self.mergeTrees(t1.right, t2.right) return node else: return t1 or t2 기억해야할 기법 return t1 or t2 둘 중 하나가 존재하면, 존재하는 객체 리턴 둘 다 존재하지 않는다면, Non..

책읽기 2021.08.03

[파이썬 알고리즘 인터뷰][트리] 이진 트리 반전

이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 문제 정의 트리의 child들을 모두 반전 책에서 구현된 코드 class Solution: def invertTree(self, root: TreeNode) -> TreeNode: if root: root.left, root.right = \ self.invertTree(root.right), self.invertTree(root.left) return root return None 기억해야할 기법 단순 swap도 재귀로 구현 재귀가 일어난 시점에서 어떤 연산이나 복잡한 과정이 필수적인 사항은 아님 놀랍게 깔끔하다 내가 구현한 코드 class Solution: def invertTree(self, root: TreeN..

책읽기 2021.08.03

[파이썬 알고리즘 인터뷰][트리] 가장 긴 동일 값의 경로

이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 문제 정의 트리에서 노드가 갖는 값이 같은 경로의 최대 길이 책에서 구현된 코드 class Solution: result: int = 0 def longestUnivaluePath(self, root: TreeNode) -> int: def dfs(node: TreeNode): if node is None: return 0 # 존재하지 않는 노드까지 DFS 재귀 탐색 left = dfs(node.left) right = dfs(node.right) # 현재 노드가 자식 노드와 동일한 경우 거리 1 증가 if node.left and node.left.val == node.val: left += 1 else: left ..

책읽기 2021.08.03

[파이썬 알고리즘 인터뷰][트리] 이진 트리의 직경

이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 문제 정의 이진 트리에서 두 노드의 가장 긴 경로 길이 출력 책에서 구현된 코드 class Solution: longest: int = 0 def diameterOfBinaryTree(self, root: TreeNode) -> int: def dfs(node: TreeNode) -> int: if not node: return -1 # 왼쪽, 오른쪽 각각 리프 노드까지 탐색 left = dfs(node.left) right = dfs(node.right) # 가장 긴 경로 self.longest = max(self.longest, left + right + 2) # 상태값 return max(left, right) ..

책읽기 2021.08.03

[파이썬 알고리즘 인터뷰][트리] 이진 트리의 최대 깊이

이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 문제 정의 트리의 최대 깊이 출력 책에서 구현된 코드 def maxDepth(self, root: TreeNode) -> int: if root is None: return 0 queue = collections.deque([root]) depth = 0 while queue: depth += 1 # 큐 연산 추출 노드의 자식 노드 삽입 for _ in range(len(queue)): cur_root = queue.popleft() if cur_root.left: queue.append(cur_root.left) if cur_root.right: queue.append(cur_root.right) # BFS 반복 횟..

책읽기 2021.08.03

[파이썬 알고리즘 인터뷰] 2부 - 파이썬 (~ 5장 - 리스트, 딕셔너리)

이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 5장 리스트, 딕셔너리 리스트와 딕셔너리는 코딩 테스트에서 무조건 사용 문제 풀이에 자유자재로 활용할 수 있도록 숙지 1) 리스트 리스트란? 순서대로 저장하는 시퀀스 - 입력 순서가 유지됨 값을 변경할 수 있는 Mutable 동적 배열로 구현됨 - C++의 Vector, Java의 ArrayList 매우 다양한 기능을 제공 - 스택/큐로써의 기능도 모두 제공 - 이는 다른 언어에 비해 매우 유리한 조건 큐로써 사용할 시 주의 - pop(0)는 O(n)을 소요 - 가장 앞의 요소를 제외한 나머지 요소들을 copy해야하기 때문 - Deque를 대산 사용 (추후 다룰 예정) min/max도 O(n) - 순차탐색을 하는듯 -..

책읽기 2021.07.12

Python의 Hashable (Dictionary의 key가 되는 기준은 무엇일까?)

Dictionary의 key는 Immutable 객체만 가능? Python에서 dictionary(dict)는 강력한 기능을 가지고 있다. dict의 정수, 문자열, 심지어 tuple도 key로 들어갈 수 있다. d = dict() d[1] = 1 d["hi"] = 2 d[(1,2,3)] = 3 "파이썬 알고리즘 인터뷰"라는 책을 읽으면서 다음과 같은 문구가 있었다[1]. 특히 파이썬의 딕셔너리는 해시할 수만 있다면 숫자뿐만 아니라, 문자, 집합까지 불변 객체를 모두 키로 사용할 수 있다. 나는 이 때 이 문장의 전체를 보지 못하고, 보고싶은 단어만 보았다. 이 문구의 의미가 "dict의 key는 불변 객체만 가능하다"라고 이해했다. 그래서 궁금했다. Immutable 객체만 key가 될 수 있는 이유가..

고민하기 2021.07.12