Skip to content

Commit 893e586

Browse files
authored
Merge pull request #1174 from river20s/main
[river20s] WEEK 01 solutions
2 parents 5c9fdf6 + cd41368 commit 893e586

File tree

5 files changed

+154
-0
lines changed

5 files changed

+154
-0
lines changed

β€Žcontains-duplicate/river20s.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution(object):
2+
3+
def containsDuplicate(self, nums):
4+
5+
"""
6+
7+
:type nums: List[int]
8+
9+
:rtype: bool
10+
11+
nums λ¦¬μŠ€νŠΈμ— 쀑볡 값이 λ‚˜μ˜€λ©΄ false,
12+
13+
λ¦¬μŠ€νŠΈμ— 쀑볡 값이 μ—†μœΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
14+
15+
- Time Complexity: O(n)
16+
17+
* 전체 배열을 ν•œ λ²ˆμ”© μˆœνšŒν•˜λ©΄μ„œ 쀑볡 μ—¬λΆ€λ₯Ό ν™•μΈν•œλ‹€.
18+
19+
- Space Complexity: O(n)
20+
21+
* Pythonμ—μ„œ set()은 λ°°μ—΄μ˜ 각 μ›μ†Œλ₯Ό ν•΄μ‹œ ν…Œμ΄λΈ”μ— μ €μž₯ν•œλ‹€.
22+
23+
배열에 μ€‘λ³΅λœ μš”μ†Œκ°€ μ „ν˜€ μ—†λ‹€λ©΄ λͺ¨λ“  μš”μ†Œ(n개)λ₯Ό set에 μ €μž₯ν•˜κ²Œ λ˜λ―€λ‘œ
24+
25+
곡간 λ³΅μž‘λ„λŠ” O(n)이 λœλ‹€.
26+
27+
"""
28+
29+
seen = set() # 쀑볡 μ—¬λΆ€ ν™•μΈν•˜λŠ” set 객체
30+
31+
for item in nums:
32+
33+
if item in seen:
34+
35+
return True
36+
37+
seen.add(item)
38+
39+
return False

β€Žhouse-robber/river20s.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
class Solution(object):
2+
def rob(self, nums):
3+
"""
4+
# 초기 풀이
5+
rob_house_even = 0 # 짝수 집듀을 ν„°λŠ” 경우 κΈˆμ•‘μ˜ ν•©
6+
rob_house_odd = 0 # ν™€μˆ˜ 집듀을 ν„°λŠ” 경우 κΈˆμ•‘μ˜ ν•©
7+
for index, value in enumerate(nums):
8+
if index % 2 == 0:
9+
rob_house_even += value
10+
else:
11+
rob_house_odd += value
12+
13+
return max(rob_house_even, rob_house_odd)
14+
# μ‹€νŒ¨:
15+
# λ‹¨μˆœνžˆ μ§μˆ˜μ™€ ν™€μˆ˜λ₯Ό κ΅¬λΆ„ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ
16+
# 졜적 ν•΄λ₯Ό ꡬ할 수 μ—†μŒ
17+
18+
===========================================
19+
20+
동적 ν”„λ‘œκ·Έλž˜λ°μ„ ν™œμš©ν•΄μ„œ 문제λ₯Ό ν•΄κ²°
21+
각각의 졜적 ν•΄λ₯Ό λˆ„μ ν•˜μ—¬ λ§ˆμ§€λ§‰κΉŒμ§€μ˜ 졜적 ν•΄λ₯Ό ꡬ해야 함
22+
23+
"""
24+
if not nums: # 빈 λ¦¬μŠ€νŠΈκ°€ μ£Όμ–΄μ§ˆ 경우, 0을 λ°˜ν™˜
25+
return 0
26+
if len(nums) == 1: # μš”μ†Œκ°€ ν•˜λ‚˜μΈ 경우, κ·Έ 값을 λ°˜ν™˜
27+
return nums[0]
28+
29+
# prev2: i-2λ²ˆμ§ΈκΉŒμ§€ κ³ λ € ν–ˆμ„ λ•Œμ˜ μ΅œλŒ€ κΈˆμ•‘
30+
# prev1: i-1λ²ˆμ§ΈκΉŒμ§€ κ³ λ € ν–ˆμ„ λ•Œμ˜ μ΅œλŒ€ κΈˆμ•‘
31+
# μ΄ˆκΈ°κ°’ μ„€μ •:
32+
# - 첫 번째 μ§‘(인덱슀 0)만 κ³ λ €ν•œ 경우 nums[0]
33+
# - 두 번째 μ§‘(인덱슀 1)κΉŒμ§€ κ³ λ €ν•œ 경우 첫 번째 μ§‘κ³Ό 두 번째 μ§‘ 쀑 큰 κ°’
34+
prev2, prev1 = nums[0], max(nums[0], nums[1])
35+
36+
for i in range(2, len(nums)):
37+
# 두 선택지 쀑 더 κΈˆμ•‘μ΄ 큰 경우λ₯Ό 계산
38+
# 1. i번째 집을 ν„Έμ§€ μ•Šμ„ λ•Œ: μ΄μ „κΉŒμ§€μ˜ μ΅œλŒ€ κΈˆμ•‘ prev1
39+
# 2. i번째 집을 ν„Έ λ•Œ: i-1번째 집은 ν„Έ 수 μ—†μŒ
40+
# i-2번째 μ§‘κΉŒμ§€μ˜ μ΅œλŒ€ κΈˆμ•‘ prev2에 ν˜„μž¬ μ§‘μ˜ κΈˆμ•‘ nums[i]λ₯Ό 더함
41+
current = max(prev1, prev2 + nums[i])
42+
43+
# 이전 λ‹¨κ³„μ˜ prev1은 λ‹€μŒ λ‹¨κ³„μ—μ„œ prev2κ°€,
44+
# current 값은 μƒˆλ‘œμš΄ prev1이 됨
45+
prev2, prev1 = prev1, current
46+
47+
# λ§ˆμ§€λ§‰ μ§‘κΉŒμ§€μ˜ μ΅œλŒ€ κΈˆμ•‘μΈ prev1 λ°˜ν™˜
48+
return prev1
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution(object):
2+
def longestConsecutive(self, nums):
3+
"""
4+
:type nums: List[int]
5+
:rtype: int
6+
>> numsμ—μ„œ μ—°μ†λœ μˆ˜μ—΄ 쀑 κ°€μž₯ κΈ΄ μˆ˜μ—΄μ˜ 길이λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
7+
(전체 풀이 과정은 λ‹€μŒ 링크λ₯Ό μ°Έκ³ ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€: https://blog.naver.com/kanosekai/223823200575)
8+
- Time Complexity: O(n)
9+
numsλ₯Ό set으둜 λ³€ν™˜ν•˜λŠ” 데 O(n) μ‹œκ°„μ΄ μ†Œμš”λ©λ‹ˆλ‹€.
10+
- Space Complexity: O(n)
11+
λͺ¨λ“  μ›μ†Œκ°€ κ³ μœ ν•œ 경우 μ „λΆ€ set에 μ €μž₯ν•˜λ―€λ‘œ
12+
O(n)의 곡간을 μΆ”κ°€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
13+
"""
14+
num_set = set(nums)
15+
longest = 0
16+
17+
for num in num_set:
18+
# num이 연속 κ΅¬κ°„μ˜ μ‹œμž‘μ μΈμ§€ νŒλ‹¨
19+
if num - 1 not in num_set:
20+
current = num
21+
current_streak = 1
22+
23+
# ν˜„μž¬ μˆ«μžμ—μ„œ μ—°μ†λœ 값듀이 set에 μžˆλŠ”μ§€ ν™•μΈν•˜λ©° μˆ˜μ—΄ ν™•μž₯
24+
while current + 1 in num_set:
25+
current += 1
26+
current_streak += 1
27+
28+
# κ°€μž₯ κΈ΄ μˆ˜μ—΄μ˜ 길이λ₯Ό λ°˜ν™˜
29+
longest = max(longest, current_streak)
30+
31+
return longest
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution(object):
2+
def topKFrequent(self, nums, k):
3+
"""
4+
μ£Όμ–΄μ§„ μ •μˆ˜ λ¦¬μŠ€νŠΈμ—μ„œ 각 숫자의 λ“±μž₯ λΉˆλ„λ₯Ό κ³„μ‚°ν•œ ν›„,
5+
λΉˆλ„μˆ˜κ°€ 높은 μˆœμ„œλŒ€λ‘œ μƒμœ„ k개의 숫자λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
6+
7+
:param nums: μ •μˆ˜λ‘œ 이루어진 리슀트
8+
:param k: λ°˜ν™˜ν•  μƒμœ„ λΉˆλ„ 숫자의 개수
9+
:return: λΉˆλ„μˆ˜κ°€ 높은 μˆœμ„œλŒ€λ‘œ μ •λ ¬λœ μƒμœ„ k개 숫자의 리슀트
10+
"""
11+
freq = {} # 각 숫자 λ“±μž₯ 횟수λ₯Ό μ €μž₯ν•˜λŠ” λ”•μ…”λ„ˆλ¦¬
12+
# 리슀트의 각 숫자 λ“±μž₯ 횟수λ₯Ό λˆ„μ  μ €μž₯
13+
for num in nums:
14+
# num이 freq에 μžˆλ‹€λ©΄ κΈ°μ‘΄ 값에 1을 λ”ν•˜κ³ , μ—†μœΌλ©΄ 0μ—μ„œ 1을 더함
15+
freq[num] = freq.get(num, 0) + 1
16+
17+
# freq의 킀듀을 λ“±μž₯ 횟수 κΈ°μ€€ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬
18+
sorted_list = sorted(freq, key=freq.get, reverse=True)
19+
# μ •λ ¬λœ λ¦¬μŠ€νŠΈμ—μ„œ top-k개 숫자λ₯Ό λ°˜ν™˜
20+
return sorted_list[:k]

β€Žtwo-sum/river20s.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution(object):
2+
def twoSum(self, nums, target):
3+
"""
4+
:type nums: List[int]
5+
:type target: int
6+
:rtype: List[int]
7+
"""
8+
seen = {}
9+
for i, num in enumerate(nums):
10+
comp = target - num
11+
if comp in seen:
12+
return seen[comp], i
13+
if num not in seen:
14+
seen[num] = i
15+
return None
16+

0 commit comments

Comments
Β (0)