diff --git a/product-of-array-except-self/KwonNayeon.py b/product-of-array-except-self/KwonNayeon.py new file mode 100644 index 000000000..1ac91388e --- /dev/null +++ b/product-of-array-except-self/KwonNayeon.py @@ -0,0 +1,38 @@ +""" +Constraints: + 1. 2 <= nums.length <= 10^5 + 2. -30 <= nums[i] <= 30 + 3. The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer + +Time Complexity: O(n) + - 배열을 두 번 순회하므로 O(n) + +Space Complexity: O(1) + - 출력 배열(answer)을 제외하면 추가 공간이 상수만큼만 필요(left, right 변수) + +풀이 방법: + 1. answer 배열을 1로 초기화 (곱셈에서는 1이 영향을 주지 않음) + 2. 왼쪽에서 오른쪽으로 순회: + - answer[i]에 현재까지의 left 누적값을 곱함 + - left *= nums[i]로 다음을 위해 left 값을 업데이트 + 3. 오른쪽에서 왼쪽으로 순회 (range(n-1, -1, -1) 사용): + - answer[i]에 현재까지의 right 누적값을 곱함 + - right *= nums[i]로 다음을 위해 right 값을 업데이트 +""" + +class Solution: + def productExceptSelf(self, nums: List[int]) -> List[int]: + 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/reverse-bits/KwonNayeon.py b/reverse-bits/KwonNayeon.py new file mode 100644 index 000000000..838ff907d --- /dev/null +++ b/reverse-bits/KwonNayeon.py @@ -0,0 +1,24 @@ +""" +Constraints: + - The input must be a binary string of length 32 + +Time Complexity: O(1) + - 항상 고정된 32비트 문자열에 대해 연산하므로 상수 시간 + +Space Complexity: O(1) + - 32비트 고정 크기의 문자열 연산만 사용하므로 상수 공간 + +풀이 방법: + 1. format(n, '032b')를 사용해 입력받은 정수를 32비트 이진수 문자열로 변환함 + 2. 문자열 슬라이싱 [::-1]으로 비트를 뒤집음 + 3. int(reversed_binary, 2)로 뒤집은 이진수 문자열을 다시 정수로 변환함 +""" + +class Solution: + def reverseBits(self, n: int) -> int: + + binary = format(n, '032b') + + reversed_binary = binary[::-1] + + return int(reversed_binary, 2) diff --git a/two-sum/KwonNayeon.py b/two-sum/KwonNayeon.py new file mode 100644 index 000000000..969e83b72 --- /dev/null +++ b/two-sum/KwonNayeon.py @@ -0,0 +1,25 @@ +""" +Constraints: + - 2 <= nums.length <= 10^4 + - -10^9 <= nums[i] <= 10^9 + - -10^9 <= target <= 10^9 + - Only one valid answer exists. + +Time Complexity: O(n²) + - 중첩 반복문을 사용하기 때문 + - 첫 번째 반복문: n번 + - 각각에 대해 두 번째 반복문: n-1, n-2, ... 1번 + - 따라서 총 연산 횟수는 n * (n-1)/2로 O(n²) + +Space Complexity: O(1) + - 추가 공간을 사용하지 않음 + - result 리스트는 항상 크기가 2로 고정 +""" +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + result = [] + + for i in range(len(nums)): + for j in range(i+1, len(nums)): + if nums[j] == target - nums[i]: + return [i, j]