Skip to content

Commit ce29393

Browse files
authored
Merge pull request #2383 from kangdaia/main
[kangdaia] WEEK 01 solutions
2 parents 87c7e6e + a93291c commit ce29393

5 files changed

Lines changed: 142 additions & 0 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution:
2+
def containsDuplicate(self, nums: list[int]) -> bool:
3+
"""
4+
๋ฆฌ์ŠคํŠธ์— ์ˆซ์ž๊ฐ€ ๋‘๋ฒˆ ์ด์ƒ ๋“ฑ์žฅํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฉด True,
5+
๋ชจ๋“  ์ˆซ์ž๊ฐ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋“ฑ์žฅํ•˜๋ฉด (unique) False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
6+
7+
๋ฐฉ๋ฒ•:
8+
1. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋™์ผํ•œ ์ˆซ์ž๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ• (with dict); o(n) ์‹œ๊ฐ„๋ณต์žก๋„
9+
2. ๋ฆฌ์ŠคํŠธ๋ฅผ set์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•; o(n) ์‹œ๊ฐ„๋ณต์žก๋„ -> PICK!
10+
3. ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•œ ํ›„ ์ธ์ ‘ํ•œ ์ˆซ์ž๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•; o(nlogn) ์‹œ๊ฐ„๋ณต์žก๋„
11+
12+
* ๊ธธ์ด๊ฐ€ 1์ผ ๊ฒฝ์šฐ, ์ค‘๋ณต์ด ์žˆ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ False๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
13+
14+
๋ฐฉ๋ฒ•(2)๊ฐ€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์ด์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ๊ธธ์ด๊ฐ€ n์ธ ๋ฆฌ์ŠคํŠธ๋ฅผ set์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ O(n) ๋งŒํผ ํ•„์š”ํ•˜๋‹ค.
15+
๋ฐฉ๋ฒ•(3)์€ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ์ •๋ ฌํ•  ๋•Œ O(nlogn) ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋“ ๋‹ค.
16+
17+
Args:
18+
nums (List[int]): ๋™์ผํ•œ ์ˆซ์ž๋ฅผ ํฌํ•จํ•œ ์ •์ˆ˜ ๋ฐฐ์—ด
19+
20+
Returns:
21+
bool: ์ค‘๋ณต์ด ์—†์œผ๋ฉด False, ์žˆ์œผ๋ฉด True
22+
"""
23+
if len(nums) <= 1:
24+
return False
25+
return len(nums) != len(set(nums))

โ€Žhouse-robber/kangdaia.pyโ€Ž

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution:
2+
def rob(self, nums: list[int]) -> int:
3+
"""
4+
์—ฐ์†๋œ ์ง‘์„ ํ›”์น˜์ง€ ์•Š๊ณ  ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ˆ์„ ํ›”์น˜๋Š” ํ•จ์ˆ˜
5+
6+
๋ฐฉ๋ฒ•
7+
1. DP ๋ฐฉ์‹์œผ๋กœ, ๊ฐ ์ง‘์„ ํ›”์น  ๋•Œ์˜ ์ตœ๋Œ€ ๋ˆ์˜ ์–‘์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•.
8+
dp[0], dp[1]๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๊ณ , dp[2]๋Š” dp[0]+nums[2]๋กœ ๊ตฌ์„ฑ
9+
์ดํ›„ dp[i]๋Š” dp[i-2]์™€ dp[i-3] ์ค‘ ํฐ ๊ฐ’์— nums[i]๋ฅผ ๋”ํ•œ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ
10+
max(dp)๋กœ ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ
11+
2. 1๋ฒˆ ๋ฐฉ๋ฒ•์—์„œ ์ ํ™”์‹์„ ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ, dp[i]๋Š” dp[i-1]๊ณผ dp[i-2]+nums[i] ์ค‘ ํฐ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•.
12+
dp[i-1]์€ i๋ฒˆ์งธ ์ง‘์„ ํ›”์น˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ์ตœ๋Œ€๊ฐ’, dp[i-2]+nums[i]๋Š” i๋ฒˆ์งธ ์ง‘์„ ํ›”์ณค์„ ๋•Œ์˜ ์ตœ๋Œ€๊ฐ’์ด๋ฏ€๋กœ, ๋‘˜ ์ค‘ ํฐ ๊ฐ’์„ dp[i]๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ์‹.
13+
dp[-1]์ด ์ตœ๋Œ€๊ฐ’์ด๋ฏ€๋กœ, max(dp) ๋Œ€์‹  dp[-1]๋กœ ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ
14+
3. 2๋ฒˆ ๋ฐฉ๋ฒ•์—์„œ dp ๋ฆฌ์ŠคํŠธ ๋Œ€์‹ , ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜๋กœ ์ด์ „ ๋‘ ์ง‘์„ ํ›”์ณค์„ ๋•Œ์˜ ์ตœ๋Œ€๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•.
15+
16+
Args:
17+
nums (list[int]): ๊ฐ ์ง‘์— ์žˆ๋Š” ๋ˆ์˜ ์–‘์ด ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ
18+
19+
Returns:
20+
int: ์ตœ๋Œ€๋กœ ํ›”์น  ์ˆ˜ ์žˆ๋Š” ๋ˆ์˜ ์–‘
21+
"""
22+
if len(nums) <= 2:
23+
return max(nums)
24+
prev1, prev2 = 0, 0
25+
for num in nums:
26+
temp = prev1
27+
prev1 = max(prev1, prev2 + num)
28+
prev2 = temp
29+
return prev1
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution:
2+
def longestConsecutive(self, nums: list[int]) -> int:
3+
"""
4+
๊ฐ€์žฅ ๊ธธ๊ฒŒ ์—ฐ์†๋œ ์ˆซ์ž๋“ค์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
5+
** ์กฐ๊ฑด: O(n) ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ํ’€์ดํ•ด์•ผ ํ•œ๋‹ค.
6+
7+
๋ฐฉ๋ฒ•
8+
0. set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ค‘๋ณต ์ œ๊ฑฐ
9+
1. ์ •๋ ฌํ•œ ํ›„ ์ˆœํšŒํ•˜๋ฉด ์—ฐ์†๋œ ์ˆซ์ž๊ฐ€ ๋Š๊ธฐ๋Š” ์ง€์ ์„ ์ฐพ์•„ max ๊ธธ์ด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•.
10+
=> O(nlogn) => ์‹œ๊ฐ„๋ณต์žก๋„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ๋‹ค.
11+
2. DP ๋ฐฉ์‹์œผ๋กœ max(list) ๋งŒํผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด, ๊ฐ ์ˆซ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์ฒดํฌํ•˜๋ฉด์„œ ์—ฐ์†๋œ ์ˆซ์ž๋“ค์˜ ๊ธธ์ด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•.
12+
=> ์Œ์ˆ˜ ์ˆซ์ž๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์–ด, ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
13+
3. ๋ชฉ๋ก์„ ์ˆœํšŒํ•˜๋ฉด์„œ, ๊ฐ ์ˆซ์ž๊ฐ€ ์—ฐ์†๋œ ์ˆซ์ž์˜ ์‹œ์ž‘์ ์ธ์ง€ ํ™•์ธํ•œ ํ›„, ์—ฐ์†๋œ ์ˆซ์ž๋“ค์˜ ๊ธธ์ด๋ฅผ ํŒŒ์•…ํ•ด, max ๊ธธ์ด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•.
14+
=> O(n)
15+
4. union-find ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด, ๊ฐ ์ˆซ์ž๋“ค์„ ์—ฐ๊ฒฐํ•œ ํ›„, ๊ฐ€์žฅ ๊ธด ์—ฐ๊ฒฐ๋œ ์ˆซ์ž๋“ค์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•.
16+
=> O(n), ๊ตฌํ˜„ x
17+
18+
Args:
19+
nums (list[int]): ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ค‘๋ณต ํฌํ•จ ์ •์ˆ˜ ๋ฐฐ์—ด
20+
21+
Returns:
22+
int: ๊ฐ€์žฅ ๊ธธ๊ฒŒ ์—ฐ์†๋œ ์ˆซ์ž๋“ค์˜ ๊ธธ์ด
23+
"""
24+
u_nums = set(nums)
25+
longest = 0
26+
for u_num in u_nums:
27+
if u_num - 1 not in u_nums:
28+
local = 1
29+
while u_num + local in u_nums:
30+
local += 1
31+
longest = max(local, longest)
32+
return longest
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import heapq
2+
from collections import Counter
3+
4+
class Solution:
5+
def topKFrequent(self, nums: list[int], k: int) -> list[int]:
6+
"""๋ฐ˜๋ณต๋˜๋Š” ํšŸ์ˆ˜๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ Top k์ธ ์ˆซ์ž๋“ค์„ ์ฐพ๋Š” ํ•จ์ˆ˜
7+
8+
๋ฐฉ๋ฒ•
9+
1. ์ „์ฒด ๋ชฉ๋ก์„ ์ˆœํšŒํ•˜๋ฉด์„œ, ๊ฐ ์ˆซ์ž๊ฐ€ ๋ช‡ ๋ฒˆ ๋‚˜์˜ค๋Š”์ง€ ์„ธ์–ด, dict map ๋งŒ๋“ค๊ธฐ.
10+
์ดํ›„ value ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ด, ์ƒ์œ„ k๊ฐœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ• => O(n) + O(n log n) => O(n log n)
11+
2. 1๋ฒˆ์˜ ๋ฐฉ๋ฒ•์—์„œ dict map์„ ๋งŒ๋“œ๋Š” ๊ฑธ, python ๋‚ด์žฅ ๋ชจ๋“ˆ์ธ Counter๋กœ ๋Œ€์ฒดํ•˜๊ธฐ.
12+
Counter๊ฐ€ ์•ฝ๊ฐ„ ๋” ๋น ๋ฆ„; C implementation์ด๊ธฐ ๋•Œ๋ฌธ.
13+
3. 1๋ฒˆ ๋ฐฉ๋ฒ•์˜ sorted ๋Œ€์‹ , heapq ๋ชจ๋“ˆ์˜ nlargest ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ธฐ.
14+
์ „์ฒด ๋ชฉ๋ก์„ ์ˆœํšŒํ•˜์ง€ ์•Š๊ณ , top k์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’๋งŒ ํŒŒ์•…ํ•˜๊ธฐ์— ํšจ์œจ์ ์ž„. O(n) + O(n log k) => O(n log k)
15+
4. quick select ์•Œ๊ณ ๋ฆฌ์ฆ˜. O(n) + O(n) => O(n); ํ•ด๋‹น ๋ฌธ์ œ์— ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•จ.
16+
17+
Args:
18+
nums (list[int]): ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ค‘๋ณต ํฌํ•จ ์ •์ˆ˜ ๋ฐฐ์—ด
19+
k (int): Top k์˜ ๊ฐœ์ˆ˜
20+
21+
Returns:
22+
list[int]: Top k์— ํ•ด๋‹นํ•˜๋Š” ์ˆซ์ž๋“ค์˜ ๋ฆฌ์ŠคํŠธ
23+
"""
24+
if len(nums) <= 1:
25+
return nums
26+
count = Counter(nums)
27+
return heapq.nlargest(k, count.keys(), key=count.get)

โ€Žtwo-sum/kangdaia.pyโ€Ž

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution:
2+
def twoSum(self, nums: list[int], target: int) -> list[int]:
3+
"""
4+
๋ฆฌ์ŠคํŠธ์—์„œ ๋‘ ์ˆซ์ž์˜ ํ•ฉ์ด target์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฉด, ๊ทธ ๋‘ ์ˆซ์ž์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
5+
6+
๋ฐฉ๋ฒ•:
7+
1. ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ, ๊ฐ ์ˆซ์ž์—์„œ target์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋‚˜๋จธ์ง€ ์ˆซ์ž๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋‘ ์ˆœํšŒ (brute-force); o(n^2) ์‹œ๊ฐ„๋ณต์žก๋„
8+
2. ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ, ๊ฐ ์ˆซ์ž์—์„œ target์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋‚˜๋จธ์ง€ ์ˆซ์ž๊ฐ€ ์žˆ๋Š”์ง€ search (binary search); o(nlogn) ์‹œ๊ฐ„๋ณต์žก๋„
9+
3. ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ, ๊ฐ ์ˆซ์ž๋ฅผ dict์— ์ €์žฅํ•˜์—ฌ (key=์ˆซ์ž, value=์ธ๋ฑ์Šค),
10+
target์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋‚˜๋จธ์ง€ ์ˆซ์ž๋ฅผ dict์—์„œ search; o(n) ์‹œ๊ฐ„๋ณต์žก๋„ -> PICK!
11+
12+
* ๋‹ต์ด ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ๋ฌธ์ œ๋ฅผ ํ’€์ด.
13+
* ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ 2 ์ดํ•˜์ธ ๊ฒฝ์šฐ, ๋‘ ์ˆซ์ž์˜ ํ•ฉ์ด target์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•˜๋ฏ€๋กœ [0, 1]์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
14+
15+
Args:
16+
nums (list[int]): ์ค‘๋ณต์„ ํฌํ•จํ•œ ์ •์ˆ˜ ๋ฐฐ์—ด
17+
target (int): ์ฐพ์•„์•ผ ํ•˜๋Š” ๋‘ ์ˆซ์ž์˜ ํ•ฉ
18+
19+
Returns:
20+
list[int]: ์ฐพ์•„๋‚ธ ๋‘ ์ˆซ์ž์˜ ์ธ๋ฑ์Šค
21+
"""
22+
if len(nums) <= 2:
23+
return [0, 1]
24+
seen = dict()
25+
for i, num in enumerate(nums):
26+
remain = target - num
27+
if remain in seen:
28+
return [seen[remain], i]
29+
seen[num] = i

0 commit comments

Comments
ย (0)