Skip to content

Commit a2d1e52

Browse files
authored
Merge pull request #1181 from hi-rachel/main
[hi-rachel] WEEK 01 solutions
2 parents 054f3be + 821aa4a commit a2d1e52

File tree

5 files changed

+248
-0
lines changed

5 files changed

+248
-0
lines changed

contains-duplicate/hi-rachel.ts

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* 어떤 value든 array에서 2번 나오면 true 반환
3+
* 다 unique한 값이면 false 반환
4+
* O(N) time, O(N) space
5+
* */
6+
7+
function containsDuplicate(nums: number[]): boolean {
8+
let numMap = new Map();
9+
10+
for (let i = 0; i < nums.length; i++) {
11+
if (numMap.has(nums[i])) {
12+
return true;
13+
} else {
14+
numMap.set(nums[i], 1);
15+
}
16+
}
17+
return false;
18+
}

house-robber/hi-rachel.py

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# O(n) time, O(n) space
2+
# dp[i]는 i번째 집까지 봤을 때의 최대 누적 금액
3+
4+
# 두 가지 선택지를 고려:
5+
# 1. 이 집을 턴다:
6+
# 이전 집은 털 수 없으니 dp[i-2] + nums[i]
7+
# 2. 이 집을 안 턴다:
8+
# 그냥 전 집까지의 최대 금액 유지: dp[i-1]
9+
# 두 가지 선택지 중 큰 걸 선택
10+
# **dp[i] = max(dp[i-1], dp[i-2] + nums[i])**
11+
# nums 길이가 2인 경우 range(2, 2)는 for문 안 돈다.
12+
13+
class Solution:
14+
def rob(self, nums: List[int]) -> int:
15+
if not nums: return 0
16+
if len(nums) == 1: return nums[0]
17+
18+
dp = [0] * len(nums)
19+
dp[0] = nums[0]
20+
dp[1] = max(nums[0], nums[1])
21+
22+
for i in range(2, len(nums)):
23+
dp[i] = max(dp[i - 1], nums[i] + dp[i - 2])
24+
25+
return dp[-1]
26+
27+
28+
# TS 코드
29+
# function rob(nums: number[]): number {
30+
# if (nums.length === 0) return 0;
31+
# if (nums.length === 1) return nums[0];
32+
33+
# const dp: number[] = new Array(nums.length).fill(0);
34+
# dp[0] = nums[0];
35+
# dp[1] = Math.max(nums[0], nums[1]);
36+
37+
# for (let i = 2; i < nums.length; i++) {
38+
# dp[i] = Math.max(dp[i - 1], nums[i] + dp[i - 2]);
39+
# }
40+
41+
# return dp[nums.length - 1];
42+
# }
+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# 처음 풀이
2+
# O(n log n) time, O(n) space
3+
4+
class Solution:
5+
def longestConsecutive(self, nums: List[int]) -> int:
6+
if nums == []:
7+
return 0
8+
9+
nums.sort()
10+
result = []
11+
cnt = 1
12+
13+
for i in range(len(nums)-1):
14+
if nums[i]+1 == nums[i+1]:
15+
cnt += 1
16+
elif nums[i] == nums[i+1]:
17+
continue
18+
else:
19+
result.append(cnt)
20+
cnt = 1
21+
result.append(cnt)
22+
23+
return max(result)
24+
25+
# 공간 복잡도 O(1) 개선 풀이
26+
# result 배열 사용시 최악의 경우 최대 n개의 숫자가 저장되므로 O(n) 공간 사용
27+
# longest 정수 변수 사용시 상수 공간 사용
28+
29+
class Solution:
30+
def longestConsecutive(self, nums: List[int]) -> int:
31+
if not nums: # pythonic code
32+
return 0
33+
34+
nums.sort()
35+
longest = 0
36+
cnt = 1
37+
38+
for i in range(len(nums)-1):
39+
if nums[i]+1 == nums[i+1]:
40+
cnt += 1
41+
elif nums[i] == nums[i+1]:
42+
continue
43+
else:
44+
longest = max(cnt, longest)
45+
cnt = 1
46+
longest = max(cnt, longest)
47+
48+
return longest
49+
50+
# 시간 복잡도 O(n) 개선 풀이
51+
# 현재 문제의 요구사항은 시간 복잡도 O(n)이었으므로, 위에 풀이들은 틀렸음 (You must write an algorithm that runs in O(n) time.)
52+
# O(n) time, O(n) space -> 리트 코드 통과 x
53+
54+
class Solution:
55+
def longestConsecutive(self, nums: List[int]) -> int:
56+
num_set = set(nums)
57+
longest = 0
58+
59+
for num in nums:
60+
if num - 1 in num_set:
61+
continue
62+
cnt = 1
63+
while num + cnt in num_set:
64+
cnt += 1
65+
longest = max(cnt, longest)
66+
67+
return longest
68+
69+
70+
# 최종 개선 풀이
71+
# O(n) time, O(n) space
72+
# 위 풀이에서 한쪽으로 구간을 찾지 않고, 양쪽으로 찾으며 숫자를 집합에서 제거하며
73+
# 집합에서 원소가 하나도 남지 않을 때까지 하면 가장 긴 구간의 길이를 구할 수 있다.
74+
# 배열의 모든 정수를 set에 저장했으므로 공간 복잡도는 O(n)
75+
76+
class Solution:
77+
def longestConsecutive(self, nums: List[int]) -> int:
78+
longest = 0
79+
num_set = set(nums)
80+
81+
while num_set:
82+
num = num_set.pop()
83+
left, right = 1, 1
84+
85+
while num - left in num_set:
86+
num_set.remove(num - left)
87+
left += 1
88+
89+
while num + right in num_set:
90+
num_set.remove(num + right)
91+
right += 1
92+
longest = max(left + right - 1, longest)
93+
94+
return longest
95+
96+
# TS 풀이
97+
# O(n) time, O(n) space
98+
# JavaScript Set에서 값을 꺼내고자 할때는 **numSet.values().next().value** 사용
99+
100+
# function longestConsecutive(nums: number[]): number {
101+
# let numSet = new Set(nums);
102+
# let longest = 0;
103+
104+
# while (numSet.size !== 0) {
105+
# let num = numSet.values().next().value;
106+
# numSet.delete(num);
107+
# let [left, right] = [1, 1];
108+
109+
# while (numSet.has(num - left)) {
110+
# numSet.delete(num - left);
111+
# left += 1;
112+
# }
113+
114+
# while (numSet.has(num + right)) {
115+
# numSet.delete(num + right);
116+
# right += 1;
117+
# }
118+
# longest = Math.max(left + right - 1, longest);
119+
# }
120+
# return longest;
121+
# };

top-k-frequent-elements/hi-rachel.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# 가장 자주 등장한 상위 K개의 문자 배열 반환
2+
# O(n log n) time, O(n) space
3+
4+
from collections import defaultdict
5+
6+
class Solution:
7+
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
8+
numdict = defaultdict(int);
9+
10+
for num in nums:
11+
numdict[num] += 1
12+
13+
sort_dict = dict(sorted(numdict.items(), key=lambda item: item[1], reverse=True))
14+
15+
keys = list(sort_dict)
16+
17+
return keys[:k]

two-sum/hi-rachel.py

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"""
2+
처음 풀이
3+
O(N^2) time, O(N) space
4+
"""
5+
6+
# class Solution:
7+
# def twoSum(self, nums: List[int], target: int) -> List[int]:
8+
# result = []
9+
# for i in range(len(nums)):
10+
# rest = target - nums[i]
11+
# rest_nums = nums[i+1:]
12+
# if rest in rest_nums:
13+
# result.extend([i, rest_nums.index(rest)+i+1])
14+
# break
15+
# return result
16+
17+
18+
"""
19+
개선 코드
20+
O(N) time, O(N) space
21+
"""
22+
23+
class Solution:
24+
def twoSum(self, nums: List[int], target: int) -> List[int]:
25+
indices = {}
26+
27+
for i, v in enumerate(nums):
28+
diff = target - v
29+
if diff in indices:
30+
j = indices[diff]
31+
return [i, j]
32+
indices[v] = i
33+
34+
# JS 풀이
35+
# /**
36+
# * @param {number[]} nums
37+
# * @param {number} target
38+
# * @return {number[]}
39+
# */
40+
# var twoSum = function(nums, target) {
41+
# let indices = new Map();
42+
43+
# for (let i = 0; i < nums.length; i++) {
44+
# diff = target - nums[i];
45+
# if (indices.has(diff)) {
46+
# return [i, indices.get(diff)];
47+
# }
48+
# indices.set(nums[i], i);
49+
# }
50+
# };

0 commit comments

Comments
 (0)