diff --git a/3sum/krokerdile.py b/3sum/krokerdile.py new file mode 100644 index 000000000..f3b10ff78 --- /dev/null +++ b/3sum/krokerdile.py @@ -0,0 +1,58 @@ +class Solution: + def threeSum(self, nums: List[int]) -> List[List[int]]: + nums.sort() + res = [] + n = len(nums) + + for i in range(n): + if i > 0 and nums[i] == nums[i-1]: + continue + + target = -nums[i] + seen = set() + j = i + 1 + + while j < n: + complement = target - nums[j] + if complement in seen: + res.append([nums[i], complement, nums[j]]) + while j + 1 < n and nums[j] == nums[j+1]: + j += 1 + seen.add(nums[j]) + j += 1 + return list(set(tuple(x) for x in res)) + + +class Solution: + def threeSum(self, nums: List[int]) -> List[List[int]]: + nums.sort() + result = [] + + for i in range(len(nums)): + # 중복된 첫 번째 수는 skip + if i > 0 and nums[i] == nums[i - 1]: + continue + + left, right = i + 1, len(nums) - 1 + + while left < right: + total = nums[i] + nums[left] + nums[right] + + if total == 0: + result.append([nums[i], nums[left], nums[right]]) + + # 중복된 두 번째, 세 번째 수 건너뛰기 + while left < right and nums[left] == nums[left + 1]: + left += 1 + while left < right and nums[right] == nums[right - 1]: + right -= 1 + + left += 1 + right -= 1 + + elif total < 0: + left += 1 # 합이 작으면 왼쪽을 오른쪽으로 + else: + right -= 1 # 합이 크면 오른쪽을 왼쪽으로 + + return result diff --git a/climbing-stairs/krokerdile.py b/climbing-stairs/krokerdile.py new file mode 100644 index 000000000..8473aeb81 --- /dev/null +++ b/climbing-stairs/krokerdile.py @@ -0,0 +1,10 @@ +class Solution: + def climbStairs(self, n: int) -> int: + one, two = 1,1 + + for i in range(n-1): + temp = one; + one = one + two; + two = temp; + + return one; diff --git a/product-of-array-except-self/krokerdile.py b/product-of-array-except-self/krokerdile.py new file mode 100644 index 000000000..669a609b6 --- /dev/null +++ b/product-of-array-except-self/krokerdile.py @@ -0,0 +1,18 @@ +class Solution: + def productExceptSelf(self, nums: List[int]) -> List[int]: + n = len(nums) + answer = [1] * n + + # 1. 왼쪽 곱 저장 + left_product = 1 + for i in range(n): + answer[i] = left_product + left_product *= nums[i] + + # 2. 오른쪽 곱을 곱해주기 + right_product = 1 + for i in reversed(range(n)): + answer[i] *= right_product + right_product *= nums[i] + + return answer diff --git a/valid-anagram/krokerdile.py b/valid-anagram/krokerdile.py new file mode 100644 index 000000000..63b38aa54 --- /dev/null +++ b/valid-anagram/krokerdile.py @@ -0,0 +1,13 @@ +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + a = {} + b = {} + + if len(s) != len(t): + return False + + for i in range(len(s)): + a[s[i]] = a.get(s[i], 0) + 1 + b[t[i]] = b.get(t[i], 0) + 1 + + return a == b diff --git a/validate-binary-search-tree/krokerdile.py b/validate-binary-search-tree/krokerdile.py new file mode 100644 index 000000000..5cae0f870 --- /dev/null +++ b/validate-binary-search-tree/krokerdile.py @@ -0,0 +1,15 @@ +class Solution: + def isValidBST(self, root: Optional[TreeNode]) -> bool: + def validate(node, low, high): + if not node: + return True + + # 현재 노드의 값이 범위를 벗어나면 False + if not (low < node.val < high): + return False + + # 왼쪽 서브트리는 최대값을 현재 노드 값으로 제한 + # 오른쪽 서브트리는 최소값을 현재 노드 값으로 제한 + return validate(node.left, low, node.val) and validate(node.right, node.val, high) + + return validate(root, float('-inf'), float('inf'))