From 892bb03e03dcd578c690c7fd3773f508cb5276ec Mon Sep 17 00:00:00 2001 From: socow Date: Fri, 5 Dec 2025 09:38:31 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Maximum=20Depth=20of=20Binary=20Tree?= =?UTF-8?q?=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- maximum-depth-of-binary-tree/socow.py | 46 +++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 maximum-depth-of-binary-tree/socow.py diff --git a/maximum-depth-of-binary-tree/socow.py b/maximum-depth-of-binary-tree/socow.py new file mode 100644 index 0000000000..0ec6c1b26e --- /dev/null +++ b/maximum-depth-of-binary-tree/socow.py @@ -0,0 +1,46 @@ + +class Solution: + def maxDepth(self, root: Optional['TreeNode']) -> int: + """ + 문제 + - 이진트리의 최대 깊이를 구하라. + + 아이디어 (재귀 DFS) + - 공집합(None)의 깊이는 0 + - 현재 노드 깊이 = max(왼쪽 서브트리 깊이, 오른쪽 서브트리 깊이) + 1 + + 시간복잡도: O(n) — 각 노드를 한 번씩 방문 + 공간복잡도: O(h) — 재귀 스택(h는 트리 높이; 최악 O(n), 평균 O(log n)) + """ + # 1) 빈 트리이면 깊이 0 + if not root: + return 0 + + # 2) 왼쪽/오른쪽 서브트리의 최대 깊이를 구한다 + left_depth = self.maxDepth(root.left) + right_depth = self.maxDepth(root.right) + + # 3) 현재 노드의 깊이 = 더 큰 서브트리 깊이 + 1(현재 노드 포함) + return max(left_depth, right_depth) + 1 +# dfs(3) - 왼쪽으로 이동 +# dfs(9) - 왼쪽으로 이동 +# dfs(None) -> 0 +# dfs(9) - 오른쪽으로 이동 +# dfs(None) -> 0 +# dfs(9) 반환: max(0,0)+1 = 1 +# dfs(3) - 오른쪽으로 이동 +# dfs(20) - 왼쪽으로 이동 +# dfs(15) - 왼쪽으로 이동 +# dfs(None) -> 0 +# dfs(15) - 오른쪽으로 이동 +# dfs(None) -> 0 +# dfs(15) 반환: max(0,0)+1 = 1 +# dfs(20) - 오른쪽으로 이동 +# dfs(7) - 왼쪽으로 이동 +# dfs(None) -> 0 +# dfs(7) - 오른쪽으로 이동 +# dfs(None) -> 0 +# dfs(7) 반환: max(0,0)+1 = 1 +# dfs(20) 반환: max(1,1)+1 = 2 +# dfs(3) 반환: max(1,2)+1 = 3 +# 최종 결과: 3 From 365c8e4e870754dba42b36c3344a99c7339dc749 Mon Sep 17 00:00:00 2001 From: socow Date: Fri, 5 Dec 2025 09:59:10 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Merge=20Two=20Sorted=20Lists=ED=92=80?= =?UTF-8?q?=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- merge-two-sorted-lists/socow.py | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 merge-two-sorted-lists/socow.py diff --git a/merge-two-sorted-lists/socow.py b/merge-two-sorted-lists/socow.py new file mode 100644 index 0000000000..dae2dc4673 --- /dev/null +++ b/merge-two-sorted-lists/socow.py @@ -0,0 +1,35 @@ +""" + 문제 요약 + - 정렬된 두 연결 리스트를 하나의 정렬된 리스트로 병합 + + 아이디어 + - dummy 노드로 시작점 고정 + - 두 리스트 비교하며 작은 값을 연결 + - 남은 리스트 한번에 연결 + + 시간복잡도: O(n + m) - 두 리스트 길이의 합 + 공간복잡도: O(1) - 추가 공간 없이 포인터만 변경 +""" + + +class Solution: + def mergeTwoLists( + self, list1: Optional[ListNode], list2: Optional[ListNode] + ) -> Optional[ListNode]: + dummy = ListNode() # 가짜 시작 노드 + node = dummy + + # 두 리스트 비교하며 병합 + while list1 and list2: + if list1.val < list2.val: + node.next = list1 + list1 = list1.next + else: + node.next = list2 + list2 = list2.next + node = node.next + + # 남은 리스트 연결 + node.next = list1 or list2 + + return dummy.next