diff --git a/3sum/jungsiroo.py b/3sum/jungsiroo.py new file mode 100644 index 000000000..ad8419cbb --- /dev/null +++ b/3sum/jungsiroo.py @@ -0,0 +1,41 @@ +class Solution: + def threeSum(self, nums: List[int]) -> List[List[int]]: + # Naive Solution + # Tc : O(n^3) / Sc : O(nC_3) + + n = len(nums) + """ + for i in range(n-2): + for j in range(i+1,n-1): + for k in range(j+1, n): + if nums[i]+nums[j]+nums[k] == 0: + ret.add(tuple(sorted([nums[i], nums[j], nums[k]]))) + + ret = [x for x in ret] + return ret + """ + + # Better Solution + # two-sum question with fixed num (traversal in for loop) + # Tc : O(n^2) / Sc : O(n) + ret = [] + nums.sort() + + for i in range(n): + if i>0 and nums[i] == nums[i-1]: + continue + j, k = i+1, n-1 + + while j < k: + sum_ = nums[i] + nums[j] + nums[k] + if sum_ < 0 : j += 1 + elif sum_ > 0 : k -= 1 + else: + ret.append([nums[i], nums[j], nums[k]]) + j += 1 + + while nums[j] == nums[j-1] and j int: + """ + dynamic programming + dp[0] = 1 + dp[1] = 1 + dp[2] = dp[0] + dp[1] = 2 + dp[3] = dp[1] + dp[2] = 3 + ... + + Tc = O(n) / Sc = O(n) + """ + + dp = [1 for _ in range(n+1)] + for i in range(2, n+1): + dp[i] = dp[i-2] + dp[i-1] + return dp[n] + diff --git a/decode-ways/jungsiroo.py b/decode-ways/jungsiroo.py new file mode 100644 index 000000000..0488e6f1a --- /dev/null +++ b/decode-ways/jungsiroo.py @@ -0,0 +1,26 @@ +class Solution: + def numDecodings(self, s: str) -> int: + """ + dp 이용 : 가능한 경우의 수를 구해놓고 그 뒤에 붙을 수 있는가? + ex) 1234 + (1,2) -> (1,2,3) + (12) -> (12,3) + (1) -> (1,23) + + Tc : O(n) / Sc : O(n) + """ + if s[0] == '0': return 0 + + n = len(s) + dp = [0]*(n+1) + dp[0] = dp[1] = 1 + + for i in range(2, n+1): + one = int(s[i-1]) + two = int(s[i-2:i]) + + if 1<=one<=9: dp[i] += dp[i-1] + if 10<=two<=26 : dp[i] += dp[i-2] + + return dp[n] + diff --git a/valid-anagram/jungsiroo.py b/valid-anagram/jungsiroo.py new file mode 100644 index 000000000..672bf0b8e --- /dev/null +++ b/valid-anagram/jungsiroo.py @@ -0,0 +1,30 @@ +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + if len(s) != len(t): + return False + + # sort and compare + # Tc : O(nlogn) / Sc : O(n)(Because of python timsort) + """ + s = sorted(s) + t = sorted(t) + for s_char, t_char in zip(s, t): + if s_char != t_char: + return False + return True + """ + + # dictionary to count letters + # Tc : O(n) / Sc : O(n) + letters_cnt = dict() + INF = int(1e6) + for s_char in s: + letters_cnt[s_char] = letters_cnt.get(s_char,0)+1 + + for t_char in t: + letters_cnt[t_char] = letters_cnt.get(t_char,INF)-1 + if letters_cnt[t_char] < 0: + return False + + return sum(letters_cnt.values()) == 0 +