From 39f2db35c00da5a9f5336ce457f4f78cb40afd08 Mon Sep 17 00:00:00 2001 From: aa601 Date: Sat, 21 Dec 2024 07:54:18 +0900 Subject: [PATCH] Feat: Add solutions for the three problems from Week 2. --- 3sum/aa601.py | 27 +++++++++++++++++++++++++++ climbing-stairs/aa601.py | 16 ++++++++++++++++ valid-anagram/aa601.py | 23 +++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 3sum/aa601.py create mode 100644 climbing-stairs/aa601.py create mode 100644 valid-anagram/aa601.py diff --git a/3sum/aa601.py b/3sum/aa601.py new file mode 100644 index 000000000..5f4208b3c --- /dev/null +++ b/3sum/aa601.py @@ -0,0 +1,27 @@ +# 전체 시간복잡도 : O(n^2), 공간복잡도 : O(n) +class Solution: + def threeSum(self, nums: list[int]) -> list[list[int]]: + nums.sort() # 내장함수 sort()의 시간복잡도 O(nlogn) + result = [] # 공간복잡도 O(n) + # 시간복잡도 O(n) + for i in range(len(nums) - 2): + if i > 0 and nums[i] == nums[i - 1]: + continue + r = len(nums) - 1 + l = i + 1 + # i를 기준으로 l과 r을 탐색하는 시간 복잡도 : O(n) + while l < r: + if nums[i] + nums[l] + nums[r] < 0: + l += 1 + elif nums[i] + nums[l] + nums[r] > 0: + r -= 1 + else: + result.append([nums[i], nums[l], nums[r]]) + while l < r and nums[l] == nums[l + 1]: # 중복 제거 반복문, 이미 진행된 리스트를 다시 탐색하지 않으므로 시간복잡도는 추가되지 않음 + l += 1 + while l < r and nums[r] == nums[r - 1]: + r -= 1 + l += 1 + r -= 1 + return result + diff --git a/climbing-stairs/aa601.py b/climbing-stairs/aa601.py new file mode 100644 index 000000000..d621d0b64 --- /dev/null +++ b/climbing-stairs/aa601.py @@ -0,0 +1,16 @@ +# 시간복잡도 : O(n), 공간복잡도 : O(1) + +class Solution: + def climbStairs(self, n: int) -> int: + a = 1 + b = 2 + if (n == 1): + return 1 + elif (n == 2): + return 2 + for i in range(n - 2): + c = a + a = b + b = c + b + return (b) + diff --git a/valid-anagram/aa601.py b/valid-anagram/aa601.py new file mode 100644 index 000000000..6ac360329 --- /dev/null +++ b/valid-anagram/aa601.py @@ -0,0 +1,23 @@ +# 시간 복잡도 : O(n), 공간 복잡도 : O(n) +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + tmp = {} + # tmp에 char:횟수 형식으로 저장 + for key in s: + if key in tmp: + tmp[key] += 1 + else: + tmp[key] = 1 + # t 문자열을 돌면서 나타나는 char에 대한 tmp의 횟수 차감 + # tmp에 존재하지 않는 char 발생 시 return False + for key in t: + if key in tmp: + tmp[key] -= 1 + else: + return False + # tmp를 돌면서 value값이 모두 0인지 확인, 모두 0일 경우 s와 t는 anagram이다 + for i in tmp: + if (tmp[i] != 0): + return False + return True +