diff --git a/combination-sum/riveroverflows.py b/combination-sum/riveroverflows.py new file mode 100644 index 000000000..f168757b1 --- /dev/null +++ b/combination-sum/riveroverflows.py @@ -0,0 +1,33 @@ +class Solution: + """ + TC: O(N^(T/M)) + - N = len(candidates), T = target, M = min(candidates) + SC: O((T/M) * N^(T/M)) + + 풀이: + 백트래킹으로 모든 조합을 탐색하되, 중복 조합 방지를 위해 + start 인덱스를 활용하여 이전 후보는 건너뛰고, 같은 후보는 재사용 허용. + path_sum > target이면 가지치기(pruning)하여 불필요한 탐색을 줄임. + """ + def combinationSum(self, candidates: list[int], target: int) -> list[list[int]]: + answer = [] + + def backtrack(start, path, path_sum): + if path_sum > target: + return + + if path_sum == target: + answer.append(path[:]) + return + + for i in range(start, len(candidates)): + candidate = candidates[i] + path.append(candidate) + path_sum += candidate + backtrack(i, path, path_sum) + path_sum -= candidate + path.pop() + + backtrack(0, [], 0) + + return answer diff --git a/number-of-1-bits/riveroverflows.py b/number-of-1-bits/riveroverflows.py new file mode 100644 index 000000000..638a6b1de --- /dev/null +++ b/number-of-1-bits/riveroverflows.py @@ -0,0 +1,20 @@ +from typing import * + + +class Solution: + """ + TC: O(log n) + SC: O(1) + + 풀이: + Brian Kernighan의 비트 트릭을 활용. + n & (n-1)은 n의 가장 오른쪽 1비트를 하나 제거한다. + n이 0이 될 때까지 반복한 횟수가 곧 1비트의 개수. + """ + def hammingWeight(self, n: int) -> int: + answer = 0 + while n > 0: + n = n & (n - 1) + answer += 1 + + return answer diff --git a/valid-palindrome/riveroverflows.py b/valid-palindrome/riveroverflows.py new file mode 100644 index 000000000..4cf434e9c --- /dev/null +++ b/valid-palindrome/riveroverflows.py @@ -0,0 +1,36 @@ +class Solution: + """ + 풀이 1: 투포인터 + TC: O(n) + SC: O(1) + + 양쪽 끝에서 포인터를 좁혀가며 알파벳/숫자만 비교. + """ + def isPalindrome(self, s: str) -> bool: + l, r = 0, len(s) - 1 + while l < r: + if not s[l].isalnum(): + l += 1 + continue + if not s[r].isalnum(): + r -= 1 + continue + + if s[l].lower() != s[r].lower(): + return False + + l += 1 + r -= 1 + + return True + + """ + 풀이 2: 리스트 변환 + 역순 비교 + TC: O(n) + SC: O(n) + + 알파벳/숫자만 추출한 리스트를 역순과 비교. + """ + def isPalindrome2(self, s: str) -> bool: + s = [c for c in s.lower() if c.isalnum()] + return s == s[::-1]