diff --git a/invert-binary-tree/HodaeSsi.py b/invert-binary-tree/HodaeSsi.py new file mode 100644 index 000000000..4e97c6008 --- /dev/null +++ b/invert-binary-tree/HodaeSsi.py @@ -0,0 +1,28 @@ +from typing import Optional + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + +# 시간 복잡도 : O(n) +# 공간 복잡도 : O(n) +class Solution: + # 오른쪽부터 탐색하는 전위 순회 구현 + def invertPreOrder(self, src: TreeNode, des: TreeNode) -> None: + des.val = src.val + if src.right: + des.left = TreeNode() + self.invertPreOrder(src.right, des.left) + if src.left: + des.right = TreeNode() + self.invertPreOrder(src.left, des.right) + + def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: + if not root: + return None + des = TreeNode() + self.invertPreOrder(root, des) + return des + diff --git a/search-in-rotated-sorted-array/HodaeSsi.py b/search-in-rotated-sorted-array/HodaeSsi.py new file mode 100644 index 000000000..7e3ce0daa --- /dev/null +++ b/search-in-rotated-sorted-array/HodaeSsi.py @@ -0,0 +1,44 @@ +from typing import List + +# 시간 복잡도 : O(log n) (* 최대 세번의 이진 탐색 수행) +# 공간 복잡도 : O(1) +class Solution: + def find_pivot_idx(self, src_list: List[int], start_idx: int, end_idx: int) -> int: + if start_idx == end_idx: + return start_idx + mid_idx = (start_idx + end_idx) // 2 + if src_list[mid_idx] > src_list[end_idx]: + return self.find_pivot_idx(src_list, mid_idx + 1, end_idx) + else: + return self.find_pivot_idx(src_list, start_idx, mid_idx) + + + def find_target_idx(self, src_list: List[int], start_idx: int, end_idx: int, target) -> int: + if start_idx > end_idx: + return -1 + if start_idx == end_idx: + if src_list[start_idx] == target: + return start_idx + else: + return -1 + + mid_idx = (start_idx + end_idx) // 2 + if src_list[mid_idx] == target: + return mid_idx + elif src_list[mid_idx] > target: + return self.find_target_idx(src_list, start_idx, mid_idx - 1, target) + else: + return self.find_target_idx(src_list, mid_idx + 1, end_idx, target) + + + def search(self, nums: List[int], target: int) -> int: + if nums[0] > nums[len(nums) - 1]: + pivot_idx = self.find_pivot_idx(nums, 0, len(nums) - 1) + left = self.find_target_idx(nums, 0, pivot_idx - 1, target) + if left != -1: + return left + else: + return self.find_target_idx(nums, pivot_idx, len(nums) - 1, target) + else: + return self.find_target_idx(nums, 0, len(nums) - 1, target) +