diff --git a/climbing-stairs/ohkingtaek.py b/climbing-stairs/ohkingtaek.py new file mode 100644 index 0000000000..49d9caf1e0 --- /dev/null +++ b/climbing-stairs/ohkingtaek.py @@ -0,0 +1,13 @@ +class Solution: + def climbStairs(self, n: int) -> int: + """ + n번째 계단에 도달하는 서로 다른 방법의 수를 구한다. + 한 번에 1칸 또는 2칸씩 올라갈 수 있으므로 DP를 사용하여 dp[i] = dp[i-1] + dp[i-2] 점화식을 사용한다. + 시간복잡도 O(n), 계단을 한 번 순회하며 결과를 계산한다. + """ + dp = [0] * (n + 2) + dp[1] = 1 + dp[2] = 2 + for i in range(3, n+1): + dp[i] = dp[i-1] + dp[i-2] + return dp[n] diff --git a/product-of-array-except-self/ohkingtaek.py b/product-of-array-except-self/ohkingtaek.py new file mode 100644 index 0000000000..9afe1a2078 --- /dev/null +++ b/product-of-array-except-self/ohkingtaek.py @@ -0,0 +1,21 @@ +class Solution: + def productExceptSelf(self, nums: List[int]) -> List[int]: + """ + 처음에 모두 곱한걸 나눈다고 생각했으나, 0을 나누기 힘들고 다른 방식으로 답이 있을거라 생각함. + 각 요소에 대해 자신을 제외한 나머지 요소들의 곱을 계산. + 왼쪽에서부터 곱을 계산하여 answer[i]에 저장하고, 오른쪽에서부터 곱을 계산하여 answer[i]에 곱함. + 시간복잡도 O(n), 배열을 두 번 순회하여 결과를 계산. + """ + n = len(nums) + answer = [1] * n + + left = 1 + for i in range(n): + answer[i] = left + left *= nums[i] + right = 1 + for i in range(n-1, -1, -1): + answer[i] *= right + right *= nums[i] + + return answer diff --git a/valid-anagram/ohkingtaek.py b/valid-anagram/ohkingtaek.py new file mode 100644 index 0000000000..03368ee6be --- /dev/null +++ b/valid-anagram/ohkingtaek.py @@ -0,0 +1,10 @@ +from collections import Counter + +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + """ + 두 문자열이 anagram인지 확인한다. + Counter를 사용하여 각 문자열의 문자 빈도수를 계산하고 비교한다. + 시간복잡도 O(n), 문자열을 한 번 순회하여 빈도수를 계산 + """ + return True if Counter(s) == Counter(t) else False diff --git a/validate-binary-search-tree/ohkingtaek.py b/validate-binary-search-tree/ohkingtaek.py new file mode 100644 index 0000000000..4a5621a971 --- /dev/null +++ b/validate-binary-search-tree/ohkingtaek.py @@ -0,0 +1,15 @@ +class Solution: + def isValidBST(self, root: Optional[TreeNode]) -> bool: + """ + DFS로 각 노드가 low < node.val < high 조건을 만족하는지 확인한다. + low와 high는 각각 왼쪽과 오른쪽 서브트리에서의 최대값과 최소값을 나타내며, 재귀적으로 확인한다. + """ + def dfs(node, low, high): + if not node: + return True + if not (low < node.val < high): + return False + + return dfs(node.left, low, node.val) and dfs(node.right, node.val, high) + + return dfs(root, float('-inf'), float('inf'))