Skip to content

Commit e89bbb3

Browse files
authored
Merge pull request #1732 from hu6r1s/main
[hu6r1s] WEEK 02 Solutions
2 parents dc2563b + 2cde15a commit e89bbb3

File tree

5 files changed

+141
-0
lines changed

5 files changed

+141
-0
lines changed

3sum/hu6r1s.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution:
2+
"""
3+
1. 3 way for문으로 돌아가면서 0인 합을 찾는 방법
4+
- O(n^3)으로 시간초과
5+
2. 투포인터
6+
- 정렬 후 투포인터를 이용하여 중복 제거와 최적화를 동시에 수행
7+
- O(n^2)
8+
공간 복잡도는 둘다 O(1)
9+
"""
10+
def threeSum(self, nums: List[int]) -> List[List[int]]:
11+
result = set()
12+
nums.sort()
13+
14+
for i in range(len(nums)):
15+
left, right = i + 1, len(nums) - 1
16+
while left < right:
17+
total = nums[i] + nums[left] + nums[right]
18+
19+
if total == 0:
20+
result.add((nums[i], nums[left], nums[right]))
21+
left += 1
22+
right -= 1
23+
elif total < 0:
24+
left += 1
25+
else:
26+
right -= 1
27+
28+
return list(result)

climbing-stairs/hu6r1s.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution:
2+
"""
3+
1일 때, 1 step -> 1개
4+
2일 때, 1 + 1, 2 -> 2개
5+
3일 때, 1 + 1 + 1, 1 + 2, 2 + 1 -> 3개
6+
4일 때, 1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 2 + 1, 2 + 1 + 1, 2 + 2 -> 5개
7+
5일 때, 1 + 1 + 1 + 1 + 1, 1 + 1 + 1 + 2, 1 + 1 + 2 + 1, 1 + 2 + 1 + 1, 2 + 1 + 1 + 1, 1 + 2 + 2, 2 + 1 + 2, 2 + 2 + 1 -> 8개
8+
순서대로 봤을 때, 이전 값과 그 이전 값의 합이 현재 개수이다.
9+
이를 점화식으로 봤을 때, dp[i] = d[i - 1] + dp[i - 2]가 된다.
10+
11+
- Time Complexity: O(n)
12+
- 1부터 n까지 한 번씩 반복하므로 선형 시간
13+
- Space Complexity: O(n)
14+
- dp 배열에 n개의 값을 저장하므로 선형 공간 사용
15+
"""
16+
def climbStairs(self, n: int) -> int:
17+
if n == 1:
18+
return n
19+
20+
dp = [0] * n
21+
dp[0] = 1
22+
dp[1] = 2
23+
for i in range(2, n):
24+
dp[i] = dp[i - 1] + dp[i - 2]
25+
return dp[-1]
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import math
2+
3+
class Solution:
4+
"""
5+
1. 인덱스 슬라이싱을 활용한 풀이
6+
- 인덱스 슬라이싱을 활용하여 해당 인덱스를 제외한 나머지 원소들의 곲을 math.prod()를 이용하여 배열에 삽입
7+
- 시간초과 O(n^2)
8+
2. DP Bottom Up 방식으로 풀이
9+
- 인덱스 i에 대한 왼쪽 부분과 오른쪽 부분의 곱을 계산하는 방식
10+
- 시간 복잡도 O(n)
11+
- 공간 복잡도 O(1)
12+
"""
13+
# 1번 풀이
14+
# def productExceptSelf(self, nums: List[int]) -> List[int]:
15+
# answer = [1] * len(n)
16+
17+
# for i in range(len(nums)):
18+
# answer.append(math.prod(nums[:i] + nums[i+1:]))
19+
20+
# return answer
21+
22+
def productExceptSelf(self, nums: List[int]) -> List[int]:
23+
dp = [1] * len(nums)
24+
25+
left = 1
26+
for i in range(len(nums)):
27+
dp[i] = left
28+
left *= nums[i]
29+
30+
right = 1
31+
for i in range(len(nums) - 1, -1, -1):
32+
dp[i] *= right
33+
right *= nums[i]
34+
return dp

valid-anagram/hu6r1s.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from collections import defaultdict
2+
3+
class Solution:
4+
"""
5+
1. Counter를 이용한 풀이
6+
- Counter로 풀이하였으나 s, t 길이가 서로 다를 때 해결되지 않음
7+
2. defaultdict 활용 풀이
8+
- 똑같이 개수 세고 제외
9+
10+
TC
11+
- s의 길이: n, t의 길이: n (조건상 같거나 비교 가능한 길이)
12+
- 첫 번째 for 루프: O(n) → s의 모든 문자를 순회
13+
- 두 번째 for 루프: O(n) → t의 모든 문자를 순회
14+
- 총 시간 복잡도 = O(n)
15+
16+
SC
17+
- counter는 알파벳 개수를 세는 용도로만 사용됨
18+
- 공간 복잡도 = O(1)
19+
"""
20+
def isAnagram(self, s: str, t: str) -> bool:
21+
counter = defaultdict(int)
22+
23+
for i in s:
24+
counter[i] += 1
25+
26+
for i in t:
27+
if i not in counter:
28+
return False
29+
counter[i] -= 1
30+
31+
if counter[i] == 0:
32+
del counter[i]
33+
return False if counter else True
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
class Solution:
8+
"""
9+
TC: O(n)
10+
SC: 최악의 경우 -> O(n), 평균 -> O(log n)
11+
- 트리가 균일할 경우 평균의 복잡도가 나오고
12+
- 한쪽이 치우친 경우 최악의 경우로 나온다.
13+
"""
14+
def isValidBST(self, root: Optional[TreeNode]) -> bool:
15+
def validate(node, left, right):
16+
if not node:
17+
return True
18+
if not (left < node.val < right):
19+
return False
20+
return validate(node.left, left, node.val) and validate(node.right, node.val, right)
21+
return validate(root, float("-inf"), float("inf"))

0 commit comments

Comments
 (0)