Skip to content

Commit 468e6e8

Browse files
Merge pull request #1448 from taurus09318976/main
[taurus09318976.py] WEEK 06 Solutions
2 parents 23bcea3 + 4264f8b commit 468e6e8

File tree

5 files changed

+269
-0
lines changed

5 files changed

+269
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'''
2+
์ด ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ๋†’์ด ๋ฐฐ์—ด์—์„œ ๋‘ ๊ฐœ์˜ ์ˆ˜์ง์„ ์„ ์„ ํƒํ•ด ์ตœ๋Œ€ ๋ฌผ์˜ ์–‘์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž„
3+
4+
์กฐ๊ฑด : 1) ๋‘ ์„  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ(๋„ˆ๋น„) * ๋‘ ์„  ์ค‘ ๋‚ฎ์€ ๋†’์ด = ๋ฌผ์˜ ์–‘
5+
2) ๋ฌผ์€ ๊ธฐ์šธ์ผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋†’์ด๋Š” ๋‚ฎ์€ ์„  ๊ธฐ์ค€์ž„
6+
7+
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• :
8+
two pointers ์ ‘๊ทผ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ
9+
์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ๋ฐฐ์—ด์˜ ์‹œ์ž‘๊ณผ ๋์— ๋ฐฐ์น˜ํ•จ
10+
๋” ๋‚ฎ์€ ๋†’์ด๋ฅผ ๊ฐ€์ง„ ํฌ์ธํ„ฐ๋ฅผ ์•ˆ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉฐ ์ตœ๋Œ€ ๋ฌผ์˜ ์–‘์„ ๊ณ„์‚ฐํ•จ
11+
12+
'''
13+
14+
class Solution:
15+
def maxArea(self, height: List[int]):
16+
# two pointers ์ดˆ๊ธฐํ™”
17+
left = 0
18+
right = len(height) - 1
19+
# ์ตœ๋Œ€ ๋ฌผ์˜ ์–‘์„ ์ €์žฅํ•  ๋ณ€์ˆ˜
20+
max_water = 0
21+
22+
# ํฌ์ธํ„ฐ๊ฐ€ ๊ต์ฐจํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ˜๋ณต
23+
while left < right:
24+
# ๋‘ ์„  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
25+
width = right - left
26+
# ๋‘ ์„  ์ค‘ ๋‚ฎ์€ ๋†’์ด ๊ณ„์‚ฐ
27+
current_height = min(height[left], height[right])
28+
# ํ˜„์žฌ ๋ฌผ์˜ ์–‘ ๊ณ„์‚ฐ
29+
current_water = width * current_height
30+
31+
# ์ตœ๋Œ€ ๋ฌผ์˜ ์–‘ ๊ณ„์‚ฐ
32+
if current_water > max_water:
33+
max_water = current_water
34+
35+
# ๋” ๋‚ฎ์€ ๋†’์ด์˜ ํฌ์ธํ„ฐ ์ด๋™
36+
if height[left] < height[right]:
37+
left += 1
38+
else:
39+
right -= 1
40+
41+
return max_water
42+
43+
44+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
'''
2+
์ด ๋ฌธ์ œ๋Š” ๋‹จ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ฒ€์ƒ‰ํ•  ๋•Œ .์„ ์™€์ผ๋“œ ์นด๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
3+
Trie ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .์ด ๋‚˜์˜ค๋ฉด ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•จ(์žฌ๊ท€์  ๊ฒ€์ƒ‰)
4+
5+
์‹œ๊ฐ„ ๋ณต์žก๋„:
6+
addWord: O(L) (L = ๋‹จ์–ด ๊ธธ์ด)
7+
search: ์ตœ์•…์˜ ๊ฒฝ์šฐ O(26^M) (M = ๋‹จ์–ด ๊ธธ์ด, .์ด ์—ฐ์†๋œ ๊ฒฝ์šฐ)
8+
*๊ฒ€์ƒ‰ํ•  ๋‹จ์–ด๊ฐ€ ๋ชจ๋‘ .๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ (์˜ˆ: ....)
9+
๊ฐ .์—์„œ 26๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ
10+
11+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(N) (N = ๋ชจ๋“  ๋‹จ์–ด์˜ ์ด ๋ฌธ์ž ์ˆ˜)
12+
13+
'''
14+
15+
class TrieNode:
16+
def __init__(self):
17+
self.children = {} # ๋ฌธ์ž -> ์ž์‹ ๋…ธ๋“œ์— ์ €์žฅ
18+
self.is_end = False # ๋‹จ์–ด ๋ ํ‘œ์‹œ
19+
20+
class WordDictionary:
21+
def __init__(self):
22+
self.root = TrieNode()
23+
24+
# ๋‹จ์–ด๋ฅผ ๋ฌธ์ž๋ณ„๋กœ ํŠธ๋ผ์ด์— ์ถ”๊ฐ€
25+
def addWord(self, word: str):
26+
node = self.root
27+
for char in word:
28+
if char not in node.children:
29+
node.children[char] = TrieNode()
30+
node = node.children[char]
31+
32+
# ๋‹จ์–ด ๋ ํ‘œ์‹œ
33+
node.is_end = True
34+
35+
# ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(dfs)ํ•จ์ˆ˜๋กœ ์žฌ๊ท€์  ํƒ์ƒ‰.
36+
def search(self, word: str):
37+
def dfs(node, index):
38+
if index == len(word):
39+
return node.is_end
40+
char = word[index]
41+
# .์ด๋ฉด ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ ํƒ์ƒ‰
42+
if char != '.':
43+
return char in node.children and dfs(node.children[char], index+1)
44+
else:
45+
for child in node.children.values():
46+
if dfs(child, index+1):
47+
return True
48+
return False
49+
50+
return dfs(self.root, 0)
51+
52+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
'''
2+
์ด ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด(LIS)์˜ ๊ธธ์ด๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ž„
3+
๋ถ€๋ถ„ ์ˆ˜์—ด์ด ์—ฐ์†๋˜์ง€๋Š” ์•Š์•„๋„ ๋˜์ง€๋งŒ ์ˆœ์„œ๋Š” ์œ ์ง€ํ•ด์•ผ ํ•จ
4+
์ด์ง„ ํƒ์ƒ‰์„ ํ™œ์šฉ!
5+
6+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)
7+
๊ฐ ์ˆซ์ž๋งˆ๋‹ค ์ด์ง„ ํƒ์ƒ‰(O(log n))์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์ „์ฒด O(n log n)
8+
9+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
10+
tails ๋ฐฐ์—ด์ด ์ตœ๋Œ€ n์˜ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•จ
11+
12+
13+
Example 1์˜ ๊ฒฝ์šฐ๋ฅผ ๋“ค๋ฉด
14+
nums = [10,9,2,5,3,7,101,18]
15+
16+
| ๋‹จ๊ณ„ | ์ฒ˜๋ฆฌํ•  ์ˆซ์ž | ๋™์ž‘ ์„ค๋ช… | `tails` ๋ฐฐ์—ด ์ƒํƒœ |
17+
|------|-------------|----------------------------------|-----------------------|
18+
| 1 | 10 | ๋นˆ ๋ฐฐ์—ด์— 10 ์ถ”๊ฐ€ | `[10]` |
19+
| 2 | 9 | 10๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 10 โ†’ 9๋กœ ๊ต์ฒด | `[9]` |
20+
| 3 | 2 | 9๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 9 โ†’ 2๋กœ ๊ต์ฒด | `[2]` |
21+
| 4 | 5 | 2๋ณด๋‹ค ํฌ๋ฏ€๋กœ 5 ์ถ”๊ฐ€ | `[2, 5]` |
22+
| 5 | 3 | 5๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 5 โ†’ 3๋กœ ๊ต์ฒด | `[2, 3]` |
23+
| 6 | 7 | 3๋ณด๋‹ค ํฌ๋ฏ€๋กœ 7 ์ถ”๊ฐ€ | `[2, 3, 7]` |
24+
| 7 | 101 | 7๋ณด๋‹ค ํฌ๋ฏ€๋กœ 101 ์ถ”๊ฐ€ | `[2, 3, 7, 101]` |
25+
| 8 | 18 | 101๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 101 โ†’ 18๋กœ ๊ต์ฒด | `[2, 3, 7, 18]` |
26+
27+
์ตœ์ข… ๊ฒฐ๊ณผ : tails ๋ฐฐ์—ด์˜ ๊ธธ์ด = 4
28+
์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด ์˜ˆ์‹œ : [2, 3, 7, 18] ๋˜๋Š” [2, 3, 7, 101] ๋“ฑ์ด ๊ฐ€๋Šฅํ•จ
29+
30+
'''
31+
32+
class Solution:
33+
def lengthOfLIS(self, nums: List[int]):
34+
35+
# ๊ฐ ๊ธธ์ด์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์ €์žฅํ•จ
36+
tails = []
37+
38+
for num in nums:
39+
40+
# num์ด ๋“ค์–ด๊ฐˆ ์ ์ ˆํ•œ ์œ„์น˜๋ฅผ ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์ฐพ์Œ
41+
index = bisect.bisect_left(tails, num)
42+
43+
if index == len(tails):
44+
45+
# num์ด tails์˜ ๋ชจ๋“  ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ์ƒˆ๋กœ์šด ๊ธธ์ด์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ƒ์„ฑ
46+
tails.append(num)
47+
else:
48+
49+
# ๊ธฐ์กด ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ๋” ์ž‘์€ num์œผ๋กœ ๊ฐฑ์‹ ํ•จ
50+
# tails ๋ฐฐ์—ด์˜ ์˜๋ฏธ๋Š” tails[i] = ๊ธธ์ด๊ฐ€ i+1์ธ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ฐ€์žฅ ์ž‘์€ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์œ ์ง€ํ•˜์—ฌ
51+
# ์ƒˆ๋กœ์šด ์ˆซ์ž๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ ์‰ฌ์›Œ์ง
52+
tails[index] = num
53+
54+
# tails์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ LIS ๊ธธ์ด์ž„
55+
return len(tails)
56+
57+

โ€Žspiral-matrix/taurus09318976.py

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
'''
2+
์ฃผ์–ด์ง„ 2์ฐจ์› ํ–‰๋ ฌ์„ ๋‚˜์„ ํ˜• ์ˆœ์„œ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ž„
3+
์กฐ๊ฑด : ์œ„->์˜ค๋ฅธ์ชฝ->์•„๋ž˜->์™ผ์ชฝ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉฐ ๋ฒ”์œ„๋ฅผ ์ขํ˜€๊ฐ
4+
5+
Example 1. ์˜ ๊ฒฝ์šฐ
6+
1 2 3
7+
4 5 6
8+
7 8 9
9+
๋‹จ๊ณ„ | top bottom left right |ํ˜„์žฌ ํ–‰๋ ฌ ์ƒํƒœ | ๋™์ž‘ ์„ค๋ช…
10+
์‹œ์ž‘ 0 2 0 2 1 2 3
11+
4 5 6
12+
7 8 9 ์œ„์ชฝ ํ–‰() ์ฒ˜๋ฆฌ ํ›„ top=1๋กœ ์ฆ๊ฐ€
13+
14+
2-1 1 2 0 2 . . .
15+
4 5 6
16+
7 8 9 ์˜ค๋ฅธ์ชฝ ์—ด(์—ด 2)์˜ ํ–‰ 1 ์ฒ˜๋ฆฌ: 6 ์ถ”๊ฐ€
17+
18+
2-2 1 2 0 2 . . .
19+
4 5 6
20+
7 8 9 ์˜ค๋ฅธ์ชฝ ์—ด(์—ด 2)์˜ ํ–‰ 2 ์ฒ˜๋ฆฌ: 9 ์ถ”๊ฐ€
21+
22+
๋ 1 2 0 1 . . .
23+
4 5 6
24+
7 8 9 ์˜ค๋ฅธ์ชฝ ์—ด ์ฒ˜๋ฆฌ ๋, right=1๋กœ ๊ฐ์†Œ
25+
26+
27+
'''
28+
29+
30+
class Solution:
31+
def spiralOrder(self, matrix: List[List[int]]):
32+
if not matrix:
33+
return []
34+
35+
result = []
36+
top, bottom = 0, len(matrix) - 1
37+
left, right = 0, len(matrix[0]) - 1
38+
39+
while top <= bottom and left <= right:
40+
41+
# ์œ„์ชฝ ํ–‰์„ ์™ผ์ชฝ โ†’ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ˆœํšŒ
42+
for i in range(left, right + 1):
43+
result.append(matrix[top][i])
44+
45+
# ๋‹ค์Œ๋ถ€ํ„ฐ ์œ„์ชฝ ํ–‰์€ ์•„๋ž˜๋กœ ํ•œ ์นธ ์ด๋™
46+
top += 1
47+
48+
# ์˜ค๋ฅธ์ชฝ ์—ด์„ ์œ„์ชฝ โ†’ ์•„๋ž˜์ชฝ๋กœ ์ˆœํšŒ
49+
for i in range(top, bottom + 1):
50+
result.append(matrix[i][right])
51+
52+
# ๋‹ค์Œ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ ์—ด์€ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™
53+
right -= 1
54+
55+
# ์•„๋ž˜์ชฝ ํ–‰์„ ์˜ค๋ฅธ์ชฝ โ†’ ์™ผ์ชฝ์œผ๋กœ ์ˆœํšŒ(ํ–‰์ด ๋‚จ์•„์žˆ์„ ๋•Œ๋งŒ)
56+
if top <= bottom:
57+
for i in range(right, left - 1, -1):
58+
result.append(matrix[bottom][i])
59+
bottom -= 1
60+
61+
# ์—ด์ด ๋‚จ์•„ ์žˆ์„ ๋•Œ๋งŒ ์™ผ์ชฝ ์—ด์„ ์•„๋ž˜์ชฝ โ†’ ์œ„์ชฝ์œผ๋กœ ์ˆœํšŒ
62+
if left <= right:
63+
for i in range(bottom, top - 1, -1):
64+
result.append(matrix[i][left])
65+
left += 1
66+
67+
return result
68+
69+
70+
71+
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
'''
2+
์ด ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด (), {}, []์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‹ซํ˜”๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ์ž„
3+
4+
์กฐ๊ฑด : 1) ๊ฐ™์€ ํƒ€์ž…์˜ ๊ด„ํ˜ธ๋กœ ๋‹ซํ˜€์•ผ ํ•จ
5+
2) ๊ด„ํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ '์ˆœ์„œ'๋กœ ๋‹ซํ˜€์•ผ ํ•จ
6+
3) ๋ชจ๋“  ๋‹ซ๋Š” ๊ด„ํ˜ธ๋Š” ๋Œ€์‘ํ•˜๋Š” ์—ฌ๋Š” ๊ด„ํ˜ธ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ
7+
8+
ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ์Šคํƒ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์—ฌ๋Š” ๊ด„ํ˜ธ๋Š” ์Šคํƒ์— ๋„ฃ๊ณ ,
9+
๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ์ง์ด ๋งž๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•จ.
10+
11+
์˜ˆ๋ฅผ ๋“ค์–ด, s = "([)]"
12+
13+
1. ( โ†’ ์Šคํƒ ์ถ”๊ฐ€
14+
2. [ โ†’ ์Šคํƒ ์ถ”๊ฐ€
15+
3. ) โ†’ ์Šคํƒ ๋งˆ์ง€๋ง‰ [์™€ ์ง์ด ์•ˆ ๋งž์Œ โ†’ False
16+
17+
'''
18+
19+
class Solution:
20+
def isValid(self, s: str):
21+
stack = []
22+
# ๋‹ซ๋Š” ๊ด„ํ˜ธ๋ฅผ ํ‚ค๋กœ, ์—ฌ๋Š” ๊ด„ํ˜ธ๋ฅผ ๊ฐ’์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ์— ์ €์žฅ
23+
pair = {')': '(', '}': '{', ']': '['}
24+
25+
for char in s:
26+
27+
#char์ด ์—ฌ๋Š” ๊ด„ํ˜ธ์ธ์ง€ ํ™•์ธ ํ›„ ๋งž์œผ๋ฉด ์Šคํƒ์— ์ถ”๊ฐ€
28+
if char in pair.values():
29+
stack.append(char)
30+
31+
32+
else:
33+
#์Šคํƒ์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์ง์ด ๋งž๋Š” ์—ฌ๋Š” ๊ด„ํ˜ธ๊ฐ€ ์—†์Œ
34+
#์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ํ˜„์žฌ ๋‹ซ๋Š” ๊ด„ํ˜ธ์˜ ์ง์ด ๋‹ค๋ฅด๋ฉด ์ž˜๋ชป๋œ ๋ฌธ์ž์—ด์ž„
35+
if not stack or pair[char] != stack.pop():
36+
37+
#๋ชจ๋“  ๋ฌธ์ž ์ฒ˜๋ฆฌ ํ›„ ์Šคํƒ์ด ๋น„์–ด ์žˆ์–ด์•ผ ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ์ž์—ด์ž„
38+
return False
39+
40+
#์Šคํƒ์ด ๋น„์–ด์žˆ์–ด์•ผ ๋ชจ๋“  ๊ด„ํ˜ธ๊ฐ€ ๋‹ซํž˜
41+
return not stack
42+
43+
44+
45+

0 commit comments

Comments
ย (0)