Skip to content

Commit 47e96fa

Browse files
authored
Merge pull request #1501 from KwonNayeon/main
2 parents 82a90a5 + ac9f691 commit 47e96fa

File tree

5 files changed

+178
-30
lines changed

5 files changed

+178
-30
lines changed

โ€Žclone-graph/KwonNayeon.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,25 @@
2929
- N: ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
3030
- dictionary์™€ ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ ๊ณต๊ฐ„
3131
32+
ํ’€์ด ๋ฐฉ๋ฒ•:
33+
- ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ: Deep copy
34+
- Base case: ๋นˆ ๊ทธ๋ž˜ํ”„ ์ฒ˜๋ฆฌ
35+
- ๋”•์…”๋„ˆ๋ฆฌ ์ƒ์„ฑ ํ›„ dfs
36+
- ๋งŒ์•ฝ ์ด๋ฏธ ๋ณต์‚ฌํ•œ ๋…ธ๋“œ๋ผ๋ฉด ํ•ด๋‹น ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•จ
37+
- ์•„๋‹ˆ๋ผ๋ฉด, ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋”•์…”๋„ˆ๋ฆฌ์— ์ €์žฅ
38+
- ์ด์›ƒ ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ์—๋„ dfs()๋กœ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ํ˜„์žฌ ๋…ธ๋“œ์˜ neighbors ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•จ
39+
- ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋ถ€ํ„ฐ ์žฌ๊ท€ ์‹œ์ž‘
40+
3241
# Definition for a Node.
3342
class Node:
3443
def __init__(self, val = 0, neighbors = None):
3544
self.val = val
3645
self.neighbors = neighbors if neighbors is not None else []
37-
38-
์ฐธ๊ณ  ์‚ฌํ•ญ:
39-
- ํ˜ผ์ž ํ’€๊ธฐ ์–ด๋ ค์›Œ์„œ, ๋ฌธ์ œ์™€ ๋‹ต์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์— ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค!
4046
"""
4147
class Solution:
4248
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
49+
50+
# ๋นˆ ๊ทธ๋ž˜ํ”„ ์ฒ˜๋ฆฌ
4351
if not node:
4452
return None
4553

@@ -51,13 +59,11 @@ def dfs(node):
5159

5260
# ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ƒ์„ฑ
5361
copy = Node(node.val)
54-
dict[node.val] = copy # dictionary์— ๊ธฐ๋ก
62+
dict[node.val] = copy
5563

56-
# ๊ฐ neighbor์— ๋Œ€ํ•ด์„œ๋„ ๊ฐ™์€ ๊ณผ์ • ์ˆ˜ํ–‰
57-
for neighbor in node.neighbors:
58-
copy.neighbors.append(dfs(neighbor))
64+
for neighbor in node.neighbors: # ์›๋ณธ์˜ ๊ฐ ์ด์›ƒ์— ๋Œ€ํ•˜์—ฌ
65+
copy.neighbors.append(dfs(neighbor)) # ๊ทธ ์ด์›ƒ์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ์ถ”๊ฐ€ํ•จ
5966

6067
return copy
6168

6269
return dfs(node)
63-

โ€Žlongest-common-subsequence/KwonNayeon.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
- 1 <= text1.length, text2.length <= 1000
44
- text1 and text2 consist of only lowercase English characters.
55
6+
<Solution 1: DFS, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ™œ์šฉ>
7+
68
Time Complexity: O(m*n)
79
- m์€ text1์˜ ๊ธธ์ด, n์€ text2์˜ ๊ธธ์ด
810
- @cache๋กœ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ๊ฐ (i,j) ์กฐํ•ฉ์„ ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐํ•จ
@@ -17,7 +19,6 @@
1719
- ๋‹ค๋ฅด๋ฉด: ํ•œ์ชฝ๋งŒ ์ด๋™ํ•œ ๊ฒฝ์šฐ ์ค‘ ์ตœ๋Œ“๊ฐ’ ์„ ํƒ
1820
3. base case: ์–ด๋А ํ•œ์ชฝ ๋ฌธ์ž์—ด ๋์— ๋„๋‹ฌํ•˜๋ฉด ์ข…๋ฃŒ
1921
"""
20-
2122
from functools import cache
2223
class Solution:
2324
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
@@ -32,3 +33,48 @@ def dfs(i, j):
3233
return max(dfs(i + 1, j), dfs(i, j + 1))
3334

3435
return dfs(0, 0)
36+
37+
"""
38+
<Solution 2: DP>
39+
40+
Time Complexity: O(n * m)
41+
- 2์ค‘ for๋ฌธ์œผ๋กœ ๋ชจ๋“  dp[i][j] ๊ณ„์‚ฐ
42+
43+
Space Complexity: O(n * m)
44+
- (n+1) * (m+1) ํฌ๊ธฐ์˜ DP ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
45+
46+
ํ’€์ด๋ฐฉ๋ฒ•:
47+
- ์ƒํƒœ ์ •์˜: dp[i][j] = text1[:i]์™€ text2[:j]์˜ LCS ๊ธธ์ด
48+
- Subsequence: ์ˆœ์„œ๋งŒ ์œ ์ง€ํ•˜๋ฉด ๋จ
49+
- Substring: ์—ฐ์†์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜์•ผ ํ•จ
50+
51+
์ ํ™”์‹:
52+
- ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด: dp[i][j] = dp[i-1][j-1] + 1
53+
- ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋ฉด: dp[i][j] = max(dp[i-1][j], dp[i][j-1])
54+
55+
ํ•ต์‹ฌ:
56+
- dp ํ…Œ์ด๋ธ” ํฌ๊ธฐ (n+1) * (m+1): ๋นˆ ๋ฌธ์ž์—ด ์ผ€์ด์Šค ํฌํ•จ
57+
- ์ตœ์ข… ๋‹ต: dp[n][m] (์ „์ฒด ๋ฌธ์ž์—ด ๋น„๊ต ๊ฒฐ๊ณผ)
58+
59+
๋…ธํŠธ:
60+
- DP ํŒจํ„ด์„ ์ฐพ์•„๋‚ด๋Š” ์—ฐ์Šตํ•˜๊ธฐ
61+
- ๋งคํŠธ๋ฆญ์Šค ํ™œ์šฉ
62+
"""
63+
class Solution:
64+
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
65+
n, m = len(text1), len(text2)
66+
67+
# DP ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”
68+
dp = [[0] * (m + 1) for _ in range(n + 1)]
69+
70+
# DP ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ
71+
for i in range(1, n + 1):
72+
for j in range(1, m + 1):
73+
if text1[i-1] == text2[j-1]:
74+
# ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด: ๋‘˜ ๋‹ค ์„ ํƒ + ์ด์ „ ๊ฒฐ๊ณผ
75+
dp[i][j] = 1 + dp[i-1][j-1]
76+
else:
77+
# ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋ฉด: ๋‘˜ ์ค‘ ํ•˜๋‚˜ ์ œ์™ธํ•˜๊ณ  ์ตœ๋Œ€๊ฐ’
78+
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
79+
80+
return dp[n][m]

โ€Žlongest-repeating-character-replacement/KwonNayeon.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,41 @@
88
- ์—ฌ๊ธฐ์„œ n์€ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
99
1010
Space Complexity: O(1)
11-
- ์ถ”๊ฐ€ ๋ณ€์ˆ˜(left, right, max_length ๋“ฑ)๋Š” ์ƒ์ˆ˜ ๊ฐœ
11+
- ์ถ”๊ฐ€ ๋ณ€์ˆ˜(max_length, max_count, start, end ๋“ฑ) ์ด์™ธ์˜ ๊ณต๊ฐ„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
1212
1313
ํ’€์ด๋ฐฉ๋ฒ•:
1414
1. Sliding Window๋กœ ๊ตฌ๊ฐ„์„ ๊ด€๋ฆฌ
15-
- right ํฌ์ธํ„ฐ๋กœ ๊ตฌ๊ฐ„์„ ๋Š˜๋ฆฌ๋‹ค๊ฐ€
16-
- ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๋ฌธ์ž ์ˆ˜๊ฐ€ k๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด left ํฌ์ธํ„ฐ๋กœ ๊ตฌ๊ฐ„์„ ์ค„์ž„
15+
- end ํฌ์ธํ„ฐ๋กœ ๊ตฌ๊ฐ„์„ ๋Š˜๋ฆฌ๋‹ค๊ฐ€
16+
- ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๋ฌธ์ž ์ˆ˜๊ฐ€ k๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด start ํฌ์ธํ„ฐ๋กœ ๊ตฌ๊ฐ„์„ ์ค„์ž„
1717
1818
2. ๊ฐ ๊ตฌ๊ฐ„์—์„œ:
19-
- ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž๋กœ ๋‚˜๋จธ์ง€๋ฅผ ๋ณ€๊ฒฝ
19+
- ๋‚˜๋จธ์ง€ ๋ฌธ์ž๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝ
2020
- (๊ตฌ๊ฐ„ ๊ธธ์ด - ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž ์ˆ˜)๊ฐ€ k ์ดํ•˜์—ฌ์•ผ ํ•จ
2121
"""
2222
class Solution:
2323
def characterReplacement(self, s: str, k: int) -> int:
24-
counter = {}
25-
left = 0
26-
max_length = 0
27-
28-
for right in range(len(s)):
29-
counter[s[right]] = counter.get(s[right], 0) + 1
30-
31-
curr_length = right - left + 1
24+
from collections import defaultdict
3225

33-
if curr_length - max(counter.values()) > k:
34-
counter[s[left]] -= 1
35-
left += 1
36-
37-
max_length = max(max_length, right - left + 1)
38-
26+
max_length = 0
27+
max_count = 0
28+
start = 0
29+
char_count = defaultdict(int)
30+
31+
for end in range(len(s)):
32+
# ํ˜„์žฌ ๋ฌธ์ž์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜ ์ฆ๊ฐ€
33+
char_count[s[end]] += 1
34+
35+
# ์œˆ๋„์šฐ ๋‚ด ๊ฐ€์žฅ ๋งŽ์ด ๋‚˜ํƒ€๋‚œ ๋ฌธ์ž์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜ ์—…๋ฐ์ดํŠธ
36+
max_count = max(max_count, char_count[s[end]])
37+
38+
# ์œˆ๋„์šฐ์˜ ํฌ๊ธฐ - ๊ฐ€์žฅ ๋งŽ์ด ๋‚˜ํƒ€๋‚œ ๋ฌธ์ž์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜ = ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋ฌธ์ž์˜ ์ˆ˜
39+
# ์ด ๋•Œ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฌธ์ž์˜ ์ข…๋ฅ˜๋Š” ์ƒ๊ด€์—†์Œ
40+
# ์ด ๊ฐ’์ด k๋ณด๋‹ค ํด ๋•Œ, ์œˆ๋„์šฐ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ž„
41+
if (end - start + 1) - max_count > k:
42+
char_count[s[start]] -= 1
43+
start += 1
44+
45+
# ์ตœ๋Œ€ ๊ธธ์ด ์—…๋ฐ์ดํŠธ
46+
max_length = max(max_length, end - start + 1)
47+
3948
return max_length
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
"""
2+
Constraints:
3+
- 1 <= s.length <= 1000
4+
- s consists of lowercase English letters.
5+
6+
<Solution 2>
7+
8+
Time Complexity: O(nยฒ)
9+
- ์™ธ๋ถ€ for๋ฌธ: n๋ฒˆ ์‹คํ–‰
10+
- ๋‚ด๋ถ€ ํ•จ์ˆ˜ (expand_around_center): ์ตœ์•…์˜ ๊ฒฝ์šฐ n๋ฒˆ ํ™•์žฅ
11+
- ๊ฒฐ๊ณผ: n * n = O(nยฒ)
12+
13+
Space Complexity: O(1)
14+
- ์ƒ์ˆ˜ ๊ณต๊ฐ„๋งŒ ์‚ฌ์šฉ (count, left, right)
15+
16+
ํ’€์ด ๋ฐฉ๋ฒ•:
17+
1. expand_around_center ํ—ฌํผ ํ•จ์ˆ˜:
18+
- ์ฃผ์–ด์ง„ ์ค‘์‹ฌ์—์„œ ์–‘์ชฝ์œผ๋กœ ํ™•์žฅํ•˜๋ฉฐ ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ์…ˆ
19+
- ๊ฒฝ๊ณ„ ์ฒดํฌ, ๋ฌธ์ž ์ผ์น˜์—ฌ๋ถ€ ํ™•์ธ
20+
21+
2. ๊ฐ ์œ„์น˜์—์„œ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ ํ™•์ธ:
22+
- ํ™€์ˆ˜ ๊ธธ์ด: expand_around_center(i, i) - ์ค‘์‹ฌ์ด ํ•œ ๊ธ€์ž
23+
- ์ง์ˆ˜ ๊ธธ์ด: expand_around_center(i, i+1) - ์ค‘์‹ฌ์ด ๋‘ ๊ธ€์ž
24+
25+
ํ•ต์‹ฌ ์•„์ด๋””์–ด:
26+
- ์ค‘์‹ฌ์—์„œ ๋ฐ”๊นฅ์œผ๋กœ ํ™•์žฅ (์•ˆ์—์„œ ๋ฐ–์œผ๋กœ)
27+
- ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ค‘์‹ฌ์ ์—์„œ ํŒฐ๋ฆฐ๋“œ๋กฌ ํƒ์ƒ‰
28+
29+
๋…ธํŠธ:
30+
- dp๋กœ๋„ ํ’€์–ด๋ณด๊ธฐ
31+
"""
32+
# Solution 1: Brute-force
33+
class Solution:
34+
def countSubstrings(self, s: str) -> int:
35+
def isPalindromic(start, end):
36+
while start < end:
37+
if s[start] != s[end]:
38+
return False
39+
start, end = start + 1, end - 1
40+
return True
41+
42+
cnt = 0
43+
44+
for i in range(0, len(s)):
45+
for j in range(i, len(s)):
46+
if isPalindromic(i, j):
47+
cnt += 1
48+
return cnt
49+
50+
# Solution 2
51+
class Solution:
52+
def countSubstrings(self, s: str) -> int:
53+
def expand_around_center(left, right):
54+
cnt = 0
55+
56+
while left >= 0 and right < len(s) and s[left] == s[right]:
57+
cnt += 1
58+
left -= 1
59+
right += 1
60+
return cnt
61+
62+
total = 0
63+
64+
for i in range(len(s)):
65+
# ํ™€์ˆ˜์ผ ๋•Œ
66+
total += expand_around_center(i, i)
67+
# ์ง์ˆ˜์ผ ๋•Œ
68+
total += expand_around_center(i, i+1)
69+
70+
return total
71+

โ€Žreverse-bits/KwonNayeon.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
2. ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์‹ฑ [::-1]์œผ๋กœ ๋น„ํŠธ๋ฅผ ๋’ค์ง‘์Œ
1616
3. int(reversed_binary, 2)๋กœ ๋’ค์ง‘์€ ์ด์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•จ
1717
"""
18-
1918
class Solution:
2019
def reverseBits(self, n: int) -> int:
2120

@@ -24,12 +23,29 @@ def reverseBits(self, n: int) -> int:
2423
reversed_binary = binary[::-1]
2524

2625
return int(reversed_binary, 2)
26+
27+
# ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•œ ๋ฒ„์ „
28+
class Solution:
29+
def reverseBits(self, n: int) -> int:
30+
31+
return int(format(n, '032b')[::-1], 2)
2732
"""
2833
<Solution 2>
2934
30-
Time Complexity:
35+
Time Complexity: O(1)
36+
- ๊ฐ ๋ฐ˜๋ณต์—์„œ ๋น„ํŠธ ์—ฐ์‚ฐ์€ ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ
3137
32-
Space Complexity:
38+
Space Complexity: O(1)
39+
- ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋Š” result์™€ ์ž…๋ ฅ๊ฐ’ n๋ฐ–์— ์—†์Œ
3340
3441
ํ’€์ด ๋ฐฉ๋ฒ•:
42+
- ...
3543
"""
44+
class Solution:
45+
def reverseBits(self, n: int) -> int:
46+
result = 0
47+
for i in range(32):
48+
result <<= 1 # ๊ฒฐ๊ณผ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ๋ฐ€๊ณ 
49+
result |= n & 1 # n์˜ ๋งˆ์ง€๋ง‰ ๋น„ํŠธ๋ฅผ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€
50+
n >>= 1 # n์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ๋ฐ€์–ด ๋‹ค์Œ ๋น„ํŠธ๋กœ ์ด๋™
51+
return result

0 commit comments

Comments
ย (0)