From 09741bdb06f61e79e2813999f3e67f405978789a Mon Sep 17 00:00:00 2001 From: aa601 Date: Sat, 1 Feb 2025 04:36:04 +0900 Subject: [PATCH] FEAT : upload #232 #244 #274 #284 --- longest-common-subsequence/aa601.py | 16 ++++++++++ .../aa601.py | 30 +++++++++++++++++++ number-of-1-bits/aa601.py | 13 ++++++++ sum-of-two-integers/aa601.py | 17 +++++++++++ 4 files changed, 76 insertions(+) create mode 100644 longest-common-subsequence/aa601.py create mode 100644 longest-repeating-character-replacement/aa601.py create mode 100644 number-of-1-bits/aa601.py create mode 100644 sum-of-two-integers/aa601.py diff --git a/longest-common-subsequence/aa601.py b/longest-common-subsequence/aa601.py new file mode 100644 index 000000000..90c76f031 --- /dev/null +++ b/longest-common-subsequence/aa601.py @@ -0,0 +1,16 @@ +''' +TC : O(nm) +SC : O(nm) +''' +class Solution: + def longestCommonSubsequence(self, text1: str, text2: str) -> int: + #dp 2차원 배열 생성 + dp = [[0 for _ in range(len(text2) + 1)] for _ in range(len(text1) + 1)] + #i와 j는 dp기준 + for i in range(1, len(text1) + 1): + for j in range(1, len(text2) + 1): + if text1[i - 1] == text2[j - 1]: + dp[i][j] = dp[i - 1][j - 1] + 1 + else: + dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]) + return dp[i][j] diff --git a/longest-repeating-character-replacement/aa601.py b/longest-repeating-character-replacement/aa601.py new file mode 100644 index 000000000..c352b00ba --- /dev/null +++ b/longest-repeating-character-replacement/aa601.py @@ -0,0 +1,30 @@ +''' +TC : O(n) + 문자열 s를 총 한번 순회한다 +SC : O(1) + 최대 26개의 글자를 딕셔너리에 저장한다 +''' +class Solution: + def characterReplacement(self, s: str, k: int) -> int: + start = 0 + max_len = 0 + max_cnt = 0 + substr_len = 0 + # 문자열 s에 대한 해시테이블을 만들고 초기 값을 0으로 설정 + dic = {char : 0 for char in s} + + # 기본적으로 end를 오른쪽으로 이동시키는 방향 + for end in range(len(s)): + dic[s[end]] += 1 + + # 현재까지의 최다 빈도 글자수 계산 + max_cnt = max(max_cnt, dic[s[end]]) + + # 현재 부분 문자열 안에서(즉 end가 고정된 상태에서) + # 바꿀 수 있는 글자의 개수가 k에 못미친다면 + # start를 오른쪽으로 한칸 당긴다 + if end - start + 1 - max_cnt > k: + dic[s[start]] -= 1 + start += 1 + max_len = max(max_len, end - start + 1) + return max_len diff --git a/number-of-1-bits/aa601.py b/number-of-1-bits/aa601.py new file mode 100644 index 000000000..62e17172e --- /dev/null +++ b/number-of-1-bits/aa601.py @@ -0,0 +1,13 @@ +''' +TC : O(logn) + 비트연산이 n을 2로 나누는 것과 같으므로 로그 시간복잡도를 갖는다 +SC : O(1) +''' +class Solution: + def hammingWeight(self, n: int) -> int: + cnt = 0 + while n != 0: + if n & 1 == 1: + cnt += 1 + n >>= 1 + return cnt diff --git a/sum-of-two-integers/aa601.py b/sum-of-two-integers/aa601.py new file mode 100644 index 000000000..1fda88258 --- /dev/null +++ b/sum-of-two-integers/aa601.py @@ -0,0 +1,17 @@ +''' +TC : O(1) + 최대 32번 반복 +SC : O(1) +''' +class Solution: + def getSum(self, a: int, b: int) -> int: + # 32비트 정수 연산을 위한 마스크 비트 설정 + mask = 0xFFFFFFFF + while b & mask : + tmp = a + a = a ^ b + b = (tmp & b) << 1 + if b > 0: # 연산결과 32비트를 벗어난 경우 a의 32비트까지 반환 + return a & mask + else: # 32비트 안에서 연산이 끝났다면 마스크할 필요 없음 + return a