Skip to content

Commit 38e674e

Browse files
authored
Merge pull request #2206 from unpo88/main
[unpo88] WEEK 06 solutions
2 parents fcfa4e1 + af8cf15 commit 38e674e

File tree

5 files changed

+371
-0
lines changed

5 files changed

+371
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
class Solution:
2+
def maxArea(self, height: List[int]) -> int:
3+
left = 0
4+
right = len(height) - 1
5+
max_area = 0
6+
7+
while left < right:
8+
min_height = min(height[left], height[right])
9+
width = right - left
10+
area = min_height * width
11+
12+
max_area = max(max_area, area)
13+
14+
if height[left] < height[right]:
15+
left += 1
16+
else:
17+
right -= 1
18+
19+
return max_area
20+
21+
22+
"""
23+
================================================================================
24+
풀이 κ³Όμ •
25+
================================================================================
26+
27+
[1μ°¨ μ‹œλ„] Brute Force둜 μ ‘κ·Όν•˜λ©΄?
28+
────────────────────────────────────────────────────────────────────────────────
29+
1. λͺ¨λ“  (i, j) μŒμ— λŒ€ν•΄ 넓이 계산
30+
2. height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
31+
- (0, 1): min(1, 8) Γ— 1 = 1
32+
- (0, 2): min(1, 6) Γ— 2 = 2
33+
- (0, 8): min(1, 7) Γ— 8 = 8
34+
- (1, 8): min(8, 7) Γ— 7 = 49 ← μ΅œλŒ€
35+
... λͺ¨λ“  μŒμ„ 확인해야 함
36+
37+
3. μ‹œκ°„λ³΅μž‘λ„: O(nΒ²) - μ‹œκ°„ 초과!
38+
4. 더 효율적인 방법이 ν•„μš”ν•¨ β†’ Two Pointer둜 μ ‘κ·Ό
39+
40+
────────────────────────────────────────────────────────────────────────────────
41+
[2μ°¨ μ‹œλ„] Two Pointer (μ–‘λμ—μ„œ 쒁히기)
42+
────────────────────────────────────────────────────────────────────────────────
43+
5. 핡심 아이디어:
44+
- 넓이 = min(height[left], height[right]) Γ— (right - left)
45+
- 폭(width)은 μ–‘λμ—μ„œ μ‹œμž‘ν•  λ•Œ μ΅œλŒ€
46+
- 포인터λ₯Ό μ•ˆμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©΄ 폭은 무쑰건 쀄어듦
47+
- λ”°λΌμ„œ 높이가 컀져야 넓이가 컀질 κ°€λŠ₯성이 있음
48+
49+
6. μ™œ μž‘μ€ μͺ½μ„ μ΄λ™ν•˜λŠ”κ°€?
50+
- μž‘μ€ μͺ½μ΄ λ†’μ΄μ˜ 병λͺ© (min이 μž‘μ€ μͺ½μ— μ˜ν•΄ 결정됨)
51+
- 큰 μͺ½μ„ μ΄λ™ν•˜λ©΄? β†’ λ†’μ΄λŠ” κ·ΈλŒ€λ‘œκ±°λ‚˜ μž‘μ•„μ§, 폭은 쀄어듦 β†’ μ†ν•΄λ§Œ
52+
- μž‘μ€ μͺ½μ„ μ΄λ™ν•˜λ©΄? β†’ 높이가 컀질 κ°€λŠ₯μ„± 있음 β†’ 이득 κ°€λŠ₯μ„±
53+
54+
7. λ™μž‘ μ˜ˆμ‹œ: height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
55+
56+
Step 1: L=0, R=8
57+
min(1, 7) Γ— 8 = 8
58+
height[L]=1 < height[R]=7 β†’ L 이동
59+
60+
Step 2: L=1, R=8
61+
min(8, 7) Γ— 7 = 49 ← μ΅œλŒ€!
62+
height[L]=8 > height[R]=7 β†’ R 이동
63+
64+
Step 3: L=1, R=7
65+
min(8, 3) Γ— 6 = 18
66+
height[L]=8 > height[R]=3 β†’ R 이동
67+
68+
... Lκ³Ό R이 λ§Œλ‚  λ•ŒκΉŒμ§€ 반볡
69+
70+
8. μ‹œκ°„λ³΅μž‘λ„: O(n) - ν•œ 번만 순회
71+
9. κ³΅κ°„λ³΅μž‘λ„: O(1) - μΆ”κ°€ 곡간 μ—†μŒ
72+
"""
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
class TrieNode:
2+
def __init__(self):
3+
self.children = {}
4+
self.is_end_word = False
5+
6+
7+
class WordDictionary:
8+
9+
def __init__(self):
10+
self.root = TrieNode()
11+
12+
def addWord(self, word: str) -> None:
13+
node = self.root
14+
for char in word:
15+
if char not in node.children:
16+
node.children[char] = TrieNode()
17+
node = node.children[char]
18+
node.is_end_word = True
19+
20+
def search(self, word: str) -> bool:
21+
return self._dfs(self.root, word, 0)
22+
23+
def _dfs(self, node: TrieNode, word: str, index: int) -> bool:
24+
# 단어 끝에 λ„λ‹¬ν•˜λ©΄ is_end_word 확인
25+
if index == len(word):
26+
return node.is_end_word
27+
28+
char = word[index]
29+
30+
if char == '.':
31+
# '.'λŠ” λͺ¨λ“  μžμ‹ λ…Έλ“œ 탐색
32+
for child in node.children.values():
33+
if self._dfs(child, word, index + 1):
34+
return True
35+
return False
36+
else:
37+
# 일반 λ¬ΈμžλŠ” ν•΄λ‹Ή μžμ‹μœΌλ‘œ 이동
38+
if char not in node.children:
39+
return False
40+
return self._dfs(node.children[char], word, index + 1)
41+
42+
43+
"""
44+
================================================================================
45+
풀이 κ³Όμ •
46+
================================================================================
47+
48+
[1μ°¨ μ‹œλ„] 길이별 κ·Έλ£Ήν™” + 브루트포슀 λ§€μΉ­
49+
────────────────────────────────────────────────────────────────────────────────
50+
1. 아이디어: 같은 길이 단어끼리 λ¬Άκ³ , ν•˜λ‚˜μ”© νŒ¨ν„΄ 비ꡐ
51+
words = { 3: ["bad", "dad", "mad"] }
52+
search(".ad") β†’ λͺ¨λ“  길이 3 단어와 비ꡐ
53+
54+
2. 문제점: Time Limit Exceeded!
55+
- 같은 길이 단어가 많으면 O(N Γ— L) 반볡
56+
- LeetCode ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ—μ„œ μ‹œκ°„ 초과
57+
58+
3. 더 효율적인 방법 ν•„μš” β†’ Trie둜 μ ‘κ·Ό
59+
60+
────────────────────────────────────────────────────────────────────────────────
61+
[2μ°¨ μ‹œλ„] Trie (트라이) 자료ꡬ쑰
62+
────────────────────────────────────────────────────────────────────────────────
63+
4. Trie ꡬ쑰 (bad, dad, mad μ €μž₯ ν›„):
64+
65+
root
66+
β”œβ”€β”€ 'b' β†’ 'a' β†’ 'd' (is_end_word=True)
67+
β”œβ”€β”€ 'd' β†’ 'a' β†’ 'd' (is_end_word=True)
68+
└── 'm' β†’ 'a' β†’ 'd' (is_end_word=True)
69+
70+
5. λ™μž‘ μ˜ˆμ‹œ:
71+
72+
search("bad"):
73+
root β†’ 'b' β†’ 'a' β†’ 'd' β†’ is_end_word=True β†’ True
74+
75+
search(".ad"):
76+
root β†’ '.' (λͺ¨λ“  μžμ‹ 탐색)
77+
β†’ 'b' β†’ 'a' β†’ 'd' β†’ True (첫 λ²ˆμ§Έμ—μ„œ 찾음!)
78+
79+
search("b.."):
80+
root β†’ 'b' β†’ '.' (λͺ¨λ“  μžμ‹)
81+
β†’ 'a' β†’ '.' (λͺ¨λ“  μžμ‹)
82+
β†’ 'd' β†’ True
83+
84+
6. μ™œ Trieκ°€ 더 λΉ λ₯Έκ°€?
85+
- μ •ν™•ν•œ 문자: O(1)둜 ν•΄λ‹Ή μžμ‹λ§Œ 탐색
86+
- '.': ν•΄λ‹Ή μœ„μΉ˜μ—μ„œλ§Œ λΆ„κΈ°, μ΄ν›„λŠ” λ‹€μ‹œ μ’ν˜€μ§
87+
- 브루트포슀: λͺ¨λ“  단어λ₯Ό μ²˜μŒλΆ€ν„° λκΉŒμ§€ 비ꡐ
88+
89+
7. μ‹œκ°„λ³΅μž‘λ„:
90+
- addWord: O(L) - L은 단어 길이
91+
- search: O(L) ~ O(26^m) - m은 '.' 개수 (보톡 적음)
92+
93+
8. κ³΅κ°„λ³΅μž‘λ„: O(N Γ— L) - λͺ¨λ“  λ‹¨μ–΄μ˜ 문자 μ €μž₯
94+
95+
9. κ΅¬ν˜„ 포인트:
96+
- TrieNode 클래슀 뢄리 β†’ 가독성 ν–₯상
97+
- _dfs μž¬κ·€λ‘œ '.' 처리 β†’ λͺ¨λ“  μžμ‹ 탐색
98+
- is_end_word둜 단어 끝 ν‘œμ‹œ β†’ 접두사와 ꡬ뢄
99+
"""
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
class Solution:
2+
def lengthOfLIS(self, nums: List[int]) -> int:
3+
n = len(nums)
4+
# dp[i] = i번째 μ›μ†Œλ‘œ λλ‚˜λŠ” LIS의 길이
5+
dp = [1] * n # μ΅œμ†Œ 자기 μžμ‹  1개
6+
7+
for i in range(1, n):
8+
for j in range(i):
9+
# nums[j] < nums[i]이면, j둜 λλ‚˜λŠ” LIS에 iλ₯Ό 뢙일 수 있음
10+
if nums[j] < nums[i]:
11+
dp[i] = max(dp[i], dp[j] + 1)
12+
13+
return max(dp)
14+
15+
"""
16+
================================================================================
17+
풀이 κ³Όμ •
18+
================================================================================
19+
20+
[1μ°¨ μ‹œλ„] νˆ¬ν¬μΈν„°?
21+
────────────────────────────────────────────────────────────────────────────────
22+
1. μ²˜μŒμ—” νˆ¬ν¬μΈν„°λ‘œ ν’€ 수 μžˆμ„ 것 κ°™μ•˜μŒ
23+
24+
2. 근데 μƒκ°ν•΄λ³΄λ‹ˆ SubsequenceλŠ” μ—°μ†λœ μ›μ†Œκ°€ μ•„λ‹ˆμ–΄λ„ 됨
25+
- Subarray(λΆ€λΆ„ λ°°μ—΄): 연속 ν•„μˆ˜ β†’ νˆ¬ν¬μΈν„° κ°€λŠ₯
26+
- Subsequence(λΆ€λΆ„ μˆ˜μ—΄): 연속 μ•ˆ 해도 됨 β†’ νˆ¬ν¬μΈν„° λΆˆκ°€
27+
28+
3. μ˜ˆμ‹œ: [10, 9, 2, 5, 3, 7, 101, 18]
29+
- LIS = [2, 3, 7, 101] (인덱슀 2, 4, 5, 6)
30+
- μ—°μ†λ˜μ§€ μ•Šμ€ μœ„μΉ˜μ—μ„œ 선택해야 함 β†’ DP둜 μ ‘κ·Ό
31+
32+
────────────────────────────────────────────────────────────────────────────────
33+
[2μ°¨ μ‹œλ„] DP
34+
────────────────────────────────────────────────────────────────────────────────
35+
4. μ •μ˜: dp[i] = nums[i]둜 λλ‚˜λŠ” LIS의 길이
36+
37+
5. 점화식:
38+
dp[i] = max(dp[j] + 1) for all j < i where nums[j] < nums[i]
39+
40+
해석: i μ΄μ „μ˜ λͺ¨λ“  jλ₯Ό λ³΄λ©΄μ„œ
41+
nums[j] < nums[i]이면 (증가 쑰건 만쑱)
42+
dp[j]에 λ‚˜λ₯Ό 뢙일 수 μžˆμœΌλ―€λ‘œ dp[j] + 1
43+
44+
6. λ™μž‘ μ˜ˆμ‹œ: nums = [10, 9, 2, 5, 3, 7, 101, 18]
45+
46+
초기: dp = [1, 1, 1, 1, 1, 1, 1, 1]
47+
48+
i=0 (10): 이전 μ›μ†Œ μ—†μŒ β†’ dp[0] = 1
49+
i=1 (9): 10 > 9 (X) β†’ dp[1] = 1
50+
i=2 (2): 10 > 2 (X), 9 > 2 (X) β†’ dp[2] = 1
51+
i=3 (5): 2 < 5 (O) β†’ dp[3] = dp[2] + 1 = 2
52+
i=4 (3): 2 < 3 (O) β†’ dp[4] = dp[2] + 1 = 2
53+
i=5 (7): 2 < 7 (O) β†’ dp[5] = 2
54+
5 < 7 (O) β†’ dp[5] = max(2, dp[3]+1) = 3
55+
3 < 7 (O) β†’ dp[5] = max(3, dp[4]+1) = 3
56+
i=6 (101): 7 < 101 (O) β†’ dp[6] = dp[5] + 1 = 4
57+
i=7 (18): 7 < 18 (O) β†’ dp[7] = dp[5] + 1 = 4
58+
59+
μ΅œμ’…: dp = [1, 1, 1, 2, 2, 3, 4, 4]
60+
λ‹΅: max(dp) = 4
61+
62+
7. μ‹œκ°„λ³΅μž‘λ„: O(nΒ²) - 이쀑 forλ¬Έ
63+
8. κ³΅κ°„λ³΅μž‘λ„: O(n) - dp λ°°μ—΄
64+
"""

β€Žspiral-matrix/unpo88.pyβ€Ž

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
class Solution:
2+
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
3+
result = []
4+
5+
while matrix:
6+
# 1. 맨 μœ„ 행을 ν†΅μ§Έλ‘œ μΆ”κ°€
7+
result += matrix.pop(0)
8+
9+
# 2. λ‚˜λ¨Έμ§€λ₯Ό 90도 λ°˜μ‹œκ³„ νšŒμ „
10+
matrix = list(zip(*matrix))[::-1]
11+
12+
return result
13+
14+
15+
"""
16+
================================================================================
17+
풀이 κ³Όμ •
18+
================================================================================
19+
20+
[μ ‘κ·Ό] ν–‰ μΆ”μΆœ + νšŒμ „
21+
────────────────────────────────────────────────────────────────────────────────
22+
1. 아이디어:
23+
- 맨 μœ„ 행을 λ–Όμ–΄λ‚΄κ³ 
24+
- 남은 행렬을 λ°˜μ‹œκ³„λ‘œ 90도 νšŒμ „
25+
- λ°˜λ³΅ν•˜λ©΄ μžμ—°μŠ€λŸ½κ²Œ spiral μˆœμ„œκ°€ 됨
26+
27+
2. λ™μž‘ μ˜ˆμ‹œ: matrix = [[1,2,3],[4,5,6],[7,8,9]]
28+
29+
Step 1: pop [1,2,3] β†’ result = [1,2,3]
30+
[[4,5,6], νšŒμ „ [[6,9],
31+
[7,8,9]] ────────→ [5,8],
32+
[4,7]]
33+
34+
Step 2: pop [6,9] β†’ result = [1,2,3,6,9]
35+
[[5,8], νšŒμ „ [[8,7],
36+
[4,7]] ────────→ [5,4]]
37+
38+
Step 3: pop [8,7] β†’ result = [1,2,3,6,9,8,7]
39+
[[5,4]] νšŒμ „ [[4],
40+
────────→ [5]]
41+
42+
Step 4: pop [4] β†’ result = [1,2,3,6,9,8,7,4]
43+
[[5]] νšŒμ „ [[5]]
44+
────────→
45+
46+
Step 5: pop [5] β†’ result = [1,2,3,6,9,8,7,4,5]
47+
[] β†’ μ’…λ£Œ
48+
49+
κ²°κ³Ό: [1,2,3,6,9,8,7,4,5]
50+
51+
3. νšŒμ „ 원리: list(zip(*matrix))[::-1]
52+
- zip(*matrix): μ—΄ λ‹¨μœ„λ‘œ λ¬ΆκΈ° (μ „μΉ˜)
53+
- [::-1]: λ’€μ§‘κΈ° (λ°˜μ‹œκ³„ νšŒμ „)
54+
55+
[[4,5,6], zip(*) [(4,7), [::-1] [(6,9),
56+
[7,8,9]] ────────→ (5,8), ────────→ (5,8),
57+
(6,9)] (4,7)]
58+
59+
4. μ‹œκ°„λ³΅μž‘λ„: O(m Γ— n) - λͺ¨λ“  μ›μ†Œ ν•œ λ²ˆμ”© 처리
60+
5. κ³΅κ°„λ³΅μž‘λ„: O(m Γ— n) - νšŒμ „ν•  λ•Œλ§ˆλ‹€ μƒˆ λ°°μ—΄ 생성
61+
"""

β€Žvalid-parentheses/unpo88.pyβ€Ž

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
class Solution:
2+
def isValid(self, s: str) -> bool:
3+
stack = []
4+
pairs = {')': '(', '}': '{', ']': '['}
5+
6+
for c in s:
7+
if c in pairs:
8+
if not stack or stack.pop() != pairs[c]:
9+
return False
10+
else:
11+
stack.append(c)
12+
13+
return not stack
14+
15+
16+
"""
17+
================================================================================
18+
풀이 κ³Όμ •
19+
================================================================================
20+
21+
[1μ°¨ μ‹œλ„] Stack으둜 직접 비ꡐ
22+
────────────────────────────────────────────────────────────────────────────────
23+
1. κ΄„ν˜Έ νŒλ…κΈ°
24+
2. Stack으둜 κ΄„ν˜Έ λ„£κ³ , λ§€μΉ­λ˜λŠ”κ²ƒμ΄ λ‚˜μ™”μ„ λ•Œ, λ°”λ‘œ popν•˜λ©΄μ„œ 비ꡐ
25+
3. ν•˜λ‚˜λΌλ„ ν‹€λ¦°κ²Œ 있으면 False
26+
4. μ•„λ‹ˆλ©΄ True
27+
28+
stack = []
29+
for c in s:
30+
if c == ')':
31+
if len(stack) == 0 or stack.pop() != '(':
32+
return False
33+
elif c == '}':
34+
if len(stack) == 0 or stack.pop() != '{':
35+
return False
36+
elif c == ']':
37+
if len(stack) == 0 or stack.pop() != '[':
38+
return False
39+
else:
40+
stack.append(c)
41+
42+
return True if len(stack) == 0 else False
43+
44+
5. 문제점: 각 λ‹«λŠ” κ΄„ν˜Έλ§ˆλ‹€ λ™μΌν•œ νŒ¨ν„΄μ΄ 반볡됨
45+
6. κ°œμ„  포인트: λ”•μ…”λ„ˆλ¦¬λ‘œ λ§€ν•‘ν•˜λ©΄ 쀑볡 제거 κ°€λŠ₯
46+
47+
────────────────────────────────────────────────────────────────────────────────
48+
[2μ°¨ μ‹œλ„] λ”•μ…”λ„ˆλ¦¬ λ§€ν•‘μœΌλ‘œ κ°œμ„ 
49+
────────────────────────────────────────────────────────────────────────────────
50+
7. pairs = {')': '(', '}': '{', ']': '['}
51+
- λ‹«λŠ” κ΄„ν˜Έ β†’ μ—¬λŠ” κ΄„ν˜Έ λ§€ν•‘
52+
53+
8. κ°œμ„ λœ 둜직:
54+
- cκ°€ λ‹«λŠ” κ΄„ν˜Έλ©΄ (c in pairs) β†’ stackμ—μ„œ popν•΄μ„œ λ§€μΉ­ 확인
55+
- cκ°€ μ—¬λŠ” κ΄„ν˜Έλ©΄ β†’ stack에 push
56+
57+
stack = []
58+
pairs = {')': '(', '}': '{', ']': '['}
59+
60+
for c in s:
61+
if c in pairs:
62+
if not stack or stack.pop() != pairs[c]:
63+
return False
64+
else:
65+
stack.append(c)
66+
67+
return not stack
68+
69+
9. μΆ”κ°€ κ°œμ„ :
70+
- len(stack) == 0 β†’ not stack
71+
- True if ... else False β†’ not stack
72+
73+
10. μ‹œκ°„λ³΅μž‘λ„: O(n) - λ¬Έμžμ—΄ ν•œ 번 순회
74+
11. κ³΅κ°„λ³΅μž‘λ„: O(n) - μ΅œμ•…μ˜ 경우 λͺ¨λ“  λ¬Έμžκ°€ μ—¬λŠ” κ΄„ν˜Έ
75+
"""

0 commit comments

Comments
Β (0)