Skip to content

Commit 3ff060e

Browse files
authored
Merge pull request #2413 from kangdaia/main
[kangdaia] WEEK 02 solutions
2 parents 4a49192 + ff57c5b commit 3ff060e

5 files changed

Lines changed: 180 additions & 0 deletions

File tree

โ€Ž3sum/kangdaia.pyโ€Ž

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class Solution:
2+
def threeSum(self, nums: list[int]) -> list[list[int]]:
3+
"""
4+
nums์—์„œ ์„ธ ์ˆซ์ž๋ฅผ ๊ณจ๋ผ ํ•ฉ์ด 0์ด ๋˜๋Š” ์กฐํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
5+
์„ธ ์ˆซ์ž๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค์— ์œ„์น˜ํ•ด์•ผ ํ•จ. ์ค‘๋ณต๋œ ์กฐํ•ฉ์€ ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•จ.
6+
7+
๋ฐฉ๋ฒ•
8+
1. brute force. ์„ธ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ์กฐํ•ฉํ•˜์—ฌ ํ•ฉ์ด 0์ด ๋˜๋Š”์ง€ ํ™•์ธ. O(n^3) ์‹œ๊ฐ„๋ณต์žก๋„ -> ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆผ!
9+
2. ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๊ณ ์ •ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋‘๊ฐœ์˜ ํ•ฉ์„ two sum ๋ฌธ์ œ์—์„œ ํ•ด๊ฒฐํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ dict์— ์ €์žฅํ•˜์—ฌ ์ฐพ๊ธฐ. O(n^2) ์‹œ๊ฐ„๋ณต์žก๋„, O(n) ๊ณต๊ฐ„๋ณต์žก๋„
10+
-> ์ค‘๋ณต๋œ ์กฐํ•ฉ์„ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•จ
11+
3. ์ •๋ ฌ์„ ํ•ด์„œ, ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๊ณ ์ •ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๋‘๊ฐœ์˜ ํ•ฉ์ด ์ฒซ๋ฒˆ์งธ ๊ฐ’์˜ ์Œ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ์Œ - ํฌ์ธํ„ฐ ๋ฐฉ์‹.
12+
-> O(n^2) ์‹œ๊ฐ„๋ณต์žก๋„, O(1) ๊ณต๊ฐ„๋ณต์žก๋„. 2๋ฒˆ ๋ฐฉ๋ฒ•๋ณด๋‹ค ์ •๋ ฌ์„ ํ•˜์ง€ ์•Š์œผ๋‹ˆ ํšจ์œจ์ 
13+
4. 3๋ฒˆ ๋ฐฉ๋ฒ•์— ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ ์ผ€์ด์Šค ํ˜น์€ ์กฐ๊ฑด์„ ์ฐพ์•„ ๋น ๋ฅด๊ฒŒ ์ข…๋ฃŒํ•˜๊ธฐ
14+
- ์ฒซ๋ฒˆ์งธ ๊ฐ’์ด ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ, ๋‚˜๋จธ์ง€ ๋‘๊ฐœ์˜ ํ•ฉ์ด ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ข…๋ฃŒ
15+
- ์ฒซ๋ฒˆ์งธ ๊ฐ’์ด ์ด์ „ ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ, ์ค‘๋ณต๋œ ์กฐํ•ฉ์ด ๋˜๋‹ˆ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
16+
- append ๊ฐ’์„ ์ฐพ์€ ํ›„์— j+1, k-1์„ ํ•˜๋ฉด์„œ ์ค‘๋ณต๋œ ๊ฐ’์ด ์•„๋‹๋•Œ๊นŒ์ง€ ์ด๋™ํ•˜๊ธฐ
17+
18+
Args:
19+
nums (list[int]): ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ •์ˆ˜๋ชฉ๋ก
20+
21+
Returns:
22+
list[list[int]]: ํ•ฉ์ด 0์ด ๋˜๋Š” ์„ธ ์ˆซ์ž์˜ ์กฐํ•ฉ ๋ชฉ๋ก
23+
"""
24+
answer = []
25+
s_nums = sorted(nums)
26+
n = len(s_nums)
27+
for i in range(n - 2):
28+
x = s_nums[i]
29+
if i > 0 and x == s_nums[i - 1]:
30+
continue
31+
if x > 0:
32+
break
33+
j, k = i + 1, n - 1
34+
while j < k:
35+
y, z = s_nums[j], s_nums[k]
36+
total = x + y + z
37+
if total == 0:
38+
answer.append([x, y, z])
39+
j += 1
40+
k -= 1
41+
while j < k and s_nums[j] == s_nums[j - 1]:
42+
j += 1
43+
while j < k and s_nums[k] == s_nums[k + 1]:
44+
k -= 1
45+
elif total < 0:
46+
j += 1
47+
else:
48+
k -= 1
49+
return answer
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution:
2+
def climbStairs(self, n: int) -> int:
3+
"""
4+
ํ•œ๋ฒˆ์— 1๊ณ„๋‹จ ํ˜น์€ 2๊ณ„๋‹จ ์”ฉ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์„๋•Œ, n๊ฐœ์˜ ๊ณ„๋‹จ์„ ์˜ฌ๋ผ๊ธฐ๊ฐ€ ์œ„ํ•œ ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
5+
6+
๋ฐฉ๋ฒ•:
7+
1. dp๋กœ ํ’€์ดํ•˜๊ธฐ. ์ ํ™”์‹ ๊ณ„์‚ฐ
8+
n=2์ผ๋•Œ, 1,1 / 2 -> 2๊ฐ€์ง€
9+
n=3์ผ๋•Œ, 1,1,1 / 1,2 / 2,1 -> 3๊ฐ€์ง€
10+
n=4์ผ๋•Œ, 1,1,1,1 / 1,1,2 / 1,2,1 / 2,1,1 / 2,2 -> 5๊ฐ€์ง€
11+
1) n-1์—์„œ 1๊ณ„๋‹จ ์˜ฌ๋ผ๊ฐ€๊ธฐ
12+
2) n-2์—์„œ 2๊ณ„๋‹จ ์˜ฌ๋ผ๊ฐ€๊ธฐ
13+
-> dp[i] = dp[i-1] + dp[i-2]
14+
2. ์ด์ „ ๊ฐ’ ๋‘๊ฐœ๋งŒ ์•Œ์•„๋‘๋ฉด ๋˜๋‹ˆ, dp ๋ฐฐ์—ด์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ , prev1, prev2๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ
15+
์‹œ๊ฐ„๋ณต์žก๋„ O(n), ๊ณต๊ฐ„๋ณต์žก๋„ O(1)
16+
17+
Args:
18+
n (int): ์ตœ์ข…์ ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€์•ผ ํ•˜๋Š” ๊ณ„๋‹จ์˜ ์ˆ˜
19+
20+
Returns:
21+
int: n๊ฐœ์˜ ๊ณ„๋‹จ์„ ์˜ฌ๋ผ๊ฐ€๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์˜ ๊ฐฏ์ˆ˜
22+
"""
23+
if n <= 3:
24+
return n
25+
prev1, prev2 = 2, 3
26+
for i in range(3, n):
27+
prev1, prev2 = prev2, prev1 + prev2
28+
return prev2
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class Solution:
2+
def productExceptSelf(self, nums: list[int]) -> list[int]:
3+
"""
4+
nums์˜ ๊ฐ ์›์†Œ์— ๋Œ€ํ•ด์„œ, ๊ทธ ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์›์†Œ๋“ค์˜ ๊ณฑ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
5+
์‹œ๊ฐ„์ œ์•ฝ์€ O(n)์ด๊ณ , ๋‚˜๋ˆ—์…ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•จ
6+
7+
๋ฐฉ๋ฒ•:
8+
1. brute-force. ๊ฐ ์›์†Œ๋งˆ๋‹ค, ๋‚˜๋จธ์ง€ ์›์†Œ๋“ค์˜ ๊ณฑ์„ ๊ตฌํ•˜๊ธฐ. O(n)์˜ ์‹œ๊ฐ„ ์ œ์•ฝ์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•จ
9+
2. ์ „์ฒด ๊ณฑ์„ ๊ตฌํ•ด๋‘๊ณ , ๊ฐ ์›์†Œ๋งˆ๋‹ค ์ž๊ธฐ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ. ๋‚˜๋ˆ—์…ˆ ์ œ์•ฝ์— ๊ฑธ๋ ค ์‚ฌ์šฉ ๋ถˆ๊ฐ€
10+
3. ๋ฃจํ”„์—์„œ ์ž์‹ ์˜ ์›์†Œ๋ฅผ ๋นผ๊ณ  ์•ž์˜ ๊ฐ’๋“ค์˜ ๊ณฑ๊ณผ ๋’ค์˜ ๊ณฑ๋“ค์˜ ๊ฐ’์„ ๊ตฌํ•˜๊ธฐ.
11+
- ์•ž์—์„œ๋ถ€ํ„ฐ ๊ณฑ์„ ๊ตฌํ•ด๋‚˜๊ฐ€๋ฉด์„œ, ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ธฐ. ์ดˆ๊ธฐ ๊ฐ’์€ 1๋กœ ์„ค์ •
12+
- ๋’ค์—์„œ๋ถ€ํ„ฐ ๊ณฑ์„ ๊ตฌํ•ด๋‚˜๊ฐ€๋ฉด์„œ, ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ธฐ. ์ดˆ๊ธฐ ๊ฐ’์€ 1๋กœ ์„ค์ •
13+
- ํ˜„ ์œ„์น˜ ๊ธฐ์ค€ ์•ž์˜ ๊ณฑ๊ณผ ๋’ค์˜ ๊ณฑ์„ ๊ณฑํ•ด์„œ ์ตœ์ข… ๋‹ต์„ ๊ตฌํ•˜๊ธฐ
14+
-> ์•ž์˜ ๊ณฑ๊ณผ ๋’ค์˜ ๊ณฑ์˜ ๋ชฉ๋ก์„ ์œ ์ง€ํ•˜๋‹ˆ ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n), ๋” ํšจ์œจํ™” ํ•  ์ˆ˜ ์—†์„๊นŒ?
15+
4. ๋ณ„๋„์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ์•ž์—์„œ๋ถ€ํ„ฐ ๊ณฑํ•˜๋ฉฐ ๋ฐฐ์—ด์— ์ €์žฅํ•œ ํ›„, ๋’ค์—์„œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ณฑํ•˜๋ฉฐ ๋™์ผ ๋ฐฐ์—ด์— ์—…๋ฐ์ดํŠธ.
16+
-> ์‹œ๊ฐ„๋ณต์žก๋„ O(n), ๊ณต๊ฐ„๋ณต์žก๋„ O(1) (๋‹ต ๋ฐฐ์—ด ์ œ์™ธ)
17+
18+
Args:
19+
nums (list[int]): ์ •์ˆ˜ ๋ชฉ๋ก
20+
21+
Returns:
22+
list[int]: ๊ฐ ์›์†Œ์— ๋Œ€ํ•ด์„œ, ๊ทธ ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์›์†Œ๋“ค์˜ ๊ณฑ์„ ๋‹ด์€ ๋ชฉ๋ก
23+
"""
24+
answer = [1] * len(nums)
25+
nxt = 1
26+
for idx, num in enumerate(nums):
27+
answer[idx] = nxt
28+
nxt *= num
29+
nxt = 1
30+
for idx in range(len(nums) - 1, -1, -1):
31+
answer[idx] *= nxt
32+
nxt *= nums[idx]
33+
return answer

โ€Žvalid-anagram/kangdaia.pyโ€Ž

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from collections import Counter
2+
3+
4+
class Solution:
5+
def isAnagram(self, s: str, t: str) -> bool:
6+
"""
7+
s์™€ t๊ฐ€ ์•„๋‚˜๊ทธ๋žจ์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜.
8+
์•„๋‚˜๊ทธ๋žจ์€ ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž๋“ค์ด ๋™์ผํ•˜์ง€๋งŒ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ๋งํ•จ. ๋Œ€์†Œ๋ฌธ์ž๋Š” ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์ง€๋งŒ, ์–ธ์–ด๋งˆ๋‹ค์˜ ํŠน์ˆ˜ ๊ธฐํ˜ธ ๋“ฑ์€ ๊ณ ๋ คํ•ด์•ผ ํ•จ.
9+
10+
๋ฐฉ๋ฒ•:
11+
1. s์™€ t๋ฅผ ์ •๋ ฌํ•˜์—ฌ ๋น„๊ต; o(nlogn) ์‹œ๊ฐ„๋ณต์žก๋„
12+
2. s์™€ t์˜ ๊ฐ ๋ฌธ์ž์˜ ๋นˆ๋„์ˆ˜๋ฅผ ์„ธ์–ด ๋น„๊ต; o(n) ์‹œ๊ฐ„๋ณต์žก๋„
13+
-> ์‹ค์ œ dict๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋ณด๋‹ค Counter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด o(n)์—์„œ๋„ ์•ฝ๊ฐ„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
14+
15+
* ์–ธ์–ด๋งˆ๋‹ค์˜ ํŠน์ˆ˜ ๋ฌธ์ž/๊ธฐํ˜ธ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ด, casefold()๋ฅผ ์‚ฌ์šฉ.
16+
17+
Args:
18+
s (str): ๋น„๊ตํ•  ๋ฌธ์ž์—ด 1
19+
t (str): ๋น„๊ตํ•  ๋ฌธ์ž์—ด 2
20+
21+
Returns:
22+
bool: s์™€ t๊ฐ€ ์•„๋‚˜๊ทธ๋žจ์ด๋ฉด True, ์•„๋‹ˆ๋ฉด False
23+
"""
24+
return Counter(s.casefold()) == Counter(t.casefold())
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from typing import Optional
2+
3+
4+
class TreeNode:
5+
def __init__(self, val=0, left=None, right=None):
6+
self.val = val
7+
self.left = left
8+
self.right = right
9+
10+
11+
class Solution:
12+
def checker(self, node: Optional[TreeNode], low: float, high: float) -> bool:
13+
"""(Helper)
14+
์ฃผ์–ด์ง„ ๋…ธ๋“œ๊ฐ€ ์œ ํšจํ•œ BST ๋…ธ๋“œ์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ํ•จ์ˆ˜
15+
16+
Args:
17+
node (Optional[TreeNode]): ๊ฒ€์ฆํ•  node ๊ฐ์ฒด
18+
low (float): node.val์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ๊ฐ’
19+
high (float): node.val์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€๊ฐ’
20+
21+
Returns:
22+
bool: node๊ฐ€ ์œ ํšจํ•œ BST ๋…ธ๋“œ์ธ์ง€ ์—ฌ๋ถ€
23+
"""
24+
if node is None:
25+
return True
26+
value = node.val
27+
left, right = node.left, node.right
28+
if not (low < value < high):
29+
return False
30+
return self.checker(left, low, value) and self.checker(right, value, high)
31+
32+
def isValidBST(self, root: Optional[TreeNode]) -> bool:
33+
"""
34+
ํ˜„์žฌ ํŠธ๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ binary tree์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ํ•จ์ˆ˜
35+
36+
checker ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ BST์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•จ.
37+
checker ํ•จ์ˆ˜๋Š” ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๊ณ , ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์ด ํ—ˆ์šฉ๋œ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•จ.
38+
์ดํ›„ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋Š” ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๋ฒ”์œ„๋กœ, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋Š” ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ํฐ ๋ฒ”์œ„๋กœ ๊ฒ€์ฆํ•จ.
39+
40+
Args:
41+
root (Optional[TreeNode]): ๊ฒ€์ฆ๋˜์ง€ ์•Š๋Š” tree ๊ฐ์ฒด
42+
43+
Returns:
44+
bool: ์˜ฌ๋ฐ”๋ฅธ binary tree์ธ์ง€ ์—ฌ๋ถ€
45+
"""
46+
return self.checker(root, -float("inf"), float("inf"))

0 commit comments

Comments
ย (0)