Skip to content

Commit 502e019

Browse files
authored
Merge pull request #964 from Chaedie/main
[Chaedie] Week 8
2 parents d6a09dc + df919d5 commit 502e019

File tree

8 files changed

+152
-6
lines changed

8 files changed

+152
-6
lines changed

clone-graph/Chaedie.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""
2+
한번에 풀지 못해 다시 풀어볼 예정입니다.
3+
4+
Solution:
5+
1) oldToNew 라는 dict 를 만들어 무한루프를 방지합니다.
6+
2) newNode = Node(node.val), newNode.neighbors.append(dfs(nei)) 를 통해 clone을 구현합니다.
7+
8+
정점 V, 간선 E
9+
Time: O(V + E)
10+
Space: O(V + E)
11+
"""
12+
13+
14+
class Solution:
15+
def cloneGraph(self, root: Optional["Node"]) -> Optional["Node"]:
16+
if not root:
17+
return None
18+
oldToNew = {}
19+
20+
def dfs(node):
21+
if node in oldToNew:
22+
return oldToNew[node]
23+
24+
newNode = Node(node.val)
25+
oldToNew[node] = newNode
26+
27+
for nei in node.neighbors:
28+
newNode.neighbors.append(dfs(nei))
29+
30+
return newNode
31+
32+
return dfs(root)

longest-common-subsequence/Chaedie.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""
2+
Solution: 재귀를 활용한 풀이, memo 를 활용한 시간복잡도 개선
3+
4+
Time: O(m * n)
5+
Space: O(2 * m * n)
6+
"""
7+
8+
9+
class Solution:
10+
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
11+
memo = {}
12+
13+
def dfs(i, j):
14+
if (i, j) in memo:
15+
return memo[(i, j)]
16+
17+
if i == len(text1) or j == len(text2):
18+
memo[(i, j)] = 0
19+
elif text1[i] == text2[j]:
20+
memo[(i, j)] = 1 + dfs(i + 1, j + 1)
21+
else:
22+
memo[(i, j)] = max(dfs(i + 1, j), dfs(i, j + 1))
23+
return memo[(i, j)]
24+
25+
return dfs(0, 0)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""
2+
Solution:
3+
1) sliding window 활용
4+
2) window 에 들어가는 글자들은 counts 라는 hash map 으로 갯수를 세어준다.
5+
3) 순회를 하면서 window size 가 counts에서 가장 큰숫자 + k 보다 크면 invalid window 이기에 left 글자 갯수를 빼고 포인터를 이동해준다.
6+
4) max_count 는 기존 max 값과 현재 window 사이즈 중 큰 숫자를 셋해준다.
7+
8+
Time: O(n) = O(26n)
9+
Space: O(1) = O(26)
10+
"""
11+
12+
13+
class Solution:
14+
def characterReplacement(self, s: str, k: int) -> int:
15+
counts = defaultdict(int)
16+
max_count = 0
17+
18+
l, r = 0, 0
19+
while l <= r and r < len(s):
20+
counts[s[r]] += 1
21+
window_size = r - l + 1
22+
23+
if window_size > max(counts.values()) + k:
24+
counts[s[l]] -= 1
25+
l += 1
26+
27+
window_size = r - l + 1
28+
max_count = max(window_size, max_count)
29+
r += 1
30+
31+
return max_count

longest-substring-without-repeating-characters/Chaedie.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
1) for iteration 을 도는 동안 hash set 을 이용해 처음 발견한 원소들을 window set에 넣는다.
44
2) 중복되는 원소를 발견할 경우 해당 원소의 중복이 사라질때까지 left side 의 원소들을 하나씩 제거한다.
55
6-
Time: O(n^2) = O(n) (for iteration) * O(n) 최악의 경우 n만큼의 중복제거
6+
Time: O(2n) = O(n) (최악의 경우 n만큼의 중복제거) * O(2) (원소당 최대 2번의 연산)
77
Space: O(n) (모든 원소가 set에 들어갈 경우)
88
"""
99

number-of-1-bits/Chaedie.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"""
2+
Solution:
3+
1) 숫자에 1 bit 을 and 연산 결과가 1일 경우 result 에 1을 더한다.
4+
2) n 을 오른쪽으로 쉬프팅 시킨다.
5+
6+
N: n의 bit 수
7+
Time: O(N)
8+
Space: O(1)
9+
10+
"""
11+
12+
13+
class Solution:
14+
def hammingWeight(self, n: int) -> int:
15+
result = 0
16+
while n > 0:
17+
if n & 1:
18+
result += 1
19+
n = n >> 1
20+
return result

reverse-linked-list/Chaedie.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
"""
22
Solution:
3-
1) next node를 저장합니다.
3+
1) temp node를 저장합니다.
44
2) cur node 를 prev node 로 연결시킵니다.
55
3) cur node 가 prev node 가 됩니다.
6-
4) cur node 는 next node 가 됩니다.
6+
4) cur node 는 temp node 가 됩니다.
77
Time: O(n)
88
Space: O(1)
99
"""
@@ -14,8 +14,8 @@ def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
1414
prev = None
1515
cur = head
1616
while cur:
17-
next = cur.next
17+
temp = cur.next
1818
cur.next = prev
1919
prev = cur
20-
cur = next
20+
cur = temp
2121
return prev

sum-of-two-integers/Chaedie.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
"""
2+
Solution: 해설을 활용한 풀이입니다.
3+
1) xor 로 더하기를 만들 수있다.
4+
2) & << 1 로 carry 를 만들 수 있다.
5+
3) python 의 경우 32비트 마스크를 사용해 음수 케이스를 고려한다.
6+
7+
"""
8+
9+
10+
class Solution:
11+
def getSum(self, a: int, b: int) -> int:
12+
mask = 0xFFFFFFFF
13+
14+
xor = a ^ b
15+
carry = (a & b) << 1
16+
while carry & mask:
17+
xor, carry = xor ^ carry, (xor & carry) << 1
18+
return (xor & mask) if carry > 0 else xor

unique-paths/Chaedie.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ def uniquePaths(self, m: int, n: int) -> int:
1717
dp = []
1818
for i in range(m):
1919
dp.append([0] * n)
20-
print(dp)
2120

2221
for i in range(m):
2322
for j in range(n):
@@ -31,3 +30,24 @@ def uniquePaths(self, m: int, n: int) -> int:
3130
dp[i][j] = up_value + left_value
3231

3332
return dp[m - 1][n - 1]
33+
34+
35+
"""
36+
* 7주차에 받은 리뷰사항 뒤늦게 반영합니다.
37+
Solution:
38+
1) dp를 1로 m*n 배열로 초기화
39+
2) 순회를 1부터 m, 1부터 n까지로 변경
40+
3) up_value, left_value 를 Out of bounds 처리 없이 dp 배열로 계산
41+
42+
"""
43+
44+
45+
class Solution:
46+
def uniquePaths(self, m: int, n: int) -> int:
47+
dp = [[1] * n] * m
48+
49+
for i in range(1, m):
50+
for j in range(1, n):
51+
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
52+
53+
return dp[m - 1][n - 1]

0 commit comments

Comments
 (0)