Skip to content

Commit a4d9cca

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 56c3d9b + b8c099d commit a4d9cca

File tree

26 files changed

+853
-0
lines changed

26 files changed

+853
-0
lines changed

3sum/hu6r1s.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution:
2+
"""
3+
1. 3 way for문으로 돌아가면서 0인 합을 찾는 방법
4+
- O(n^3)으로 시간초과
5+
2. 투포인터
6+
- 정렬 후 투포인터를 이용하여 중복 제거와 최적화를 동시에 수행
7+
- O(n^2)
8+
공간 복잡도는 둘다 O(1)
9+
"""
10+
def threeSum(self, nums: List[int]) -> List[List[int]]:
11+
result = set()
12+
nums.sort()
13+
14+
for i in range(len(nums)):
15+
left, right = i + 1, len(nums) - 1
16+
while left < right:
17+
total = nums[i] + nums[left] + nums[right]
18+
19+
if total == 0:
20+
result.add((nums[i], nums[left], nums[right]))
21+
left += 1
22+
right -= 1
23+
elif total < 0:
24+
left += 1
25+
else:
26+
right -= 1
27+
28+
return list(result)

3sum/hyunjung-choi.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
fun threeSum(nums: IntArray): List<List<Int>> {
3+
if (nums.size < 3) return emptyList()
4+
5+
val result = mutableSetOf<List<Int>>()
6+
7+
nums.sort()
8+
9+
for (i in 0 until nums.size - 2) {
10+
11+
if (i > 0 && nums[i] == nums[i - 1]) continue
12+
13+
var left = i + 1
14+
var right = nums.size - 1
15+
16+
while (left < right) {
17+
val sum = nums[i] + nums[left] + nums[right]
18+
19+
when {
20+
sum == 0 -> {
21+
result.add(listOf(nums[i], nums[left], nums[right]))
22+
23+
left++
24+
right--
25+
}
26+
27+
sum < 0 -> left++
28+
else -> right--
29+
}
30+
}
31+
}
32+
33+
return result.toList()
34+
}
35+
}

3sum/jongwanra.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
"""
2+
[Problem]
3+
https://leetcode.com/problems/3sum/description/
4+
5+
[Brainstorm]
6+
3 <= nums.length <= 3,000
7+
Brute Force: O(N^3) => 27,000,000,000 => time limited
8+
O(N^2)의 풀이는 시간 제한에 걸리지 않을 것으로 보인다. 3,000 * 3,000 => 9,000,000
9+
10+
[Plan]
11+
1. map을 설정한다. key = elements value: index list
12+
2. nested-loop을 순회한다.
13+
2-1. i == j인 경우 제외
14+
2-2. map에서 동일한 인덱스인 경우 제외하고 구한다.
15+
16+
"""
17+
18+
from typing import List
19+
20+
21+
class Solution:
22+
"""
23+
Attempt-1 My solution (incorrect)
24+
time limited
25+
"""
26+
27+
def threeSum1(self, nums: List[int]) -> List[List[int]]:
28+
map = {}
29+
for index in range(len(nums)):
30+
values = map.get(nums[index], [])
31+
values.append(index)
32+
map[nums[index]] = values
33+
34+
triplets = set()
35+
for i in range(len(nums)):
36+
for j in range(len(nums)):
37+
if i == j:
38+
continue
39+
complement = -(nums[i] + nums[j])
40+
# print(f"nums[{i}]={nums[i]}, nums[{j}]={nums[j]} , complement={complement}")
41+
if complement in map:
42+
values = map[complement]
43+
for k in values:
44+
if k == i or k == j:
45+
continue
46+
triplets.add(tuple(sorted([nums[i], nums[j], nums[k]])))
47+
return list(triplets)
48+
49+
"""
50+
Attempt-2 Another solution
51+
ref: https://www.algodale.com/problems/3sum/
52+
53+
"""
54+
55+
def threeSum2(self, nums: List[int]) -> List[List[int]]:
56+
triplets = set()
57+
58+
for index in range(len(nums) - 2):
59+
seen = set()
60+
for j in range(index + 1, len(nums)):
61+
complement = -(nums[index] + nums[j])
62+
if complement in seen:
63+
triplet = [nums[index], nums[j], complement]
64+
triplets.add(tuple(sorted(triplet)))
65+
seen.add(nums[j])
66+
67+
return list(triplets)
68+
69+
"""
70+
Attempt-3 Another solution
71+
ref: https://www.algodale.com/problems/3sum/
72+
73+
[Plan]
74+
two-pointer로 접근한다.
75+
76+
[Complexity]
77+
N: nums.length
78+
Time: O(N^2)
79+
Space: O(1)
80+
"""
81+
82+
def threeSum3(self, nums: List[int]) -> List[List[int]]:
83+
triplets = set()
84+
nums.sort()
85+
86+
for index in range(len(nums) - 2):
87+
left = index + 1
88+
right = len(nums) - 1
89+
90+
while left < right:
91+
three_sum = nums[index] + nums[left] + nums[right]
92+
if three_sum < 0:
93+
left += 1
94+
continue
95+
if three_sum > 0:
96+
right -= 1
97+
continue
98+
triplets.add((nums[index], nums[left], nums[right]))
99+
left += 1
100+
right -= 1
101+
return list(triplets)
102+
103+
104+
sol = Solution()
105+
print(sol.threeSum3([-1, 0, 1, 2, -1, 4]))
106+

3sum/mkwkw.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
//set-up

climbing-stairs/hu6r1s.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution:
2+
"""
3+
1일 때, 1 step -> 1개
4+
2일 때, 1 + 1, 2 -> 2개
5+
3일 때, 1 + 1 + 1, 1 + 2, 2 + 1 -> 3개
6+
4일 때, 1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 2 + 1, 2 + 1 + 1, 2 + 2 -> 5개
7+
5일 때, 1 + 1 + 1 + 1 + 1, 1 + 1 + 1 + 2, 1 + 1 + 2 + 1, 1 + 2 + 1 + 1, 2 + 1 + 1 + 1, 1 + 2 + 2, 2 + 1 + 2, 2 + 2 + 1 -> 8개
8+
순서대로 봤을 때, 이전 값과 그 이전 값의 합이 현재 개수이다.
9+
이를 점화식으로 봤을 때, dp[i] = d[i - 1] + dp[i - 2]가 된다.
10+
11+
- Time Complexity: O(n)
12+
- 1부터 n까지 한 번씩 반복하므로 선형 시간
13+
- Space Complexity: O(n)
14+
- dp 배열에 n개의 값을 저장하므로 선형 공간 사용
15+
"""
16+
def climbStairs(self, n: int) -> int:
17+
if n == 1:
18+
return n
19+
20+
dp = [0] * n
21+
dp[0] = 1
22+
dp[1] = 2
23+
for i in range(2, n):
24+
dp[i] = dp[i - 1] + dp[i - 2]
25+
return dp[-1]

climbing-stairs/hyunjung-choi.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
fun climbStairs(n: Int): Int {
3+
if (n <= 2) return n
4+
5+
var prev2 = 1
6+
var prev1 = 2
7+
8+
for (i in 3..n) {
9+
val current = prev1 + prev2
10+
prev2 = prev1
11+
prev1 = current
12+
}
13+
14+
return prev1
15+
}
16+
}

climbing-stairs/jongwanra.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
"""
2+
[Problem]
3+
https://leetcode.com/problems/climbing-stairs/
4+
5+
[Brainstorming]
6+
한 번에 갈 수 있는 계단: 1 or 2
7+
갈 수 있는 경우의 수를 구해야 하는 문제
8+
constraints: 1 <= n <= 45
9+
10+
n = 1, 1
11+
n = 2, 2
12+
n = 3, 3
13+
n = 4, 5
14+
...
15+
f(n) = f(n - 1) + f(n - 2)
16+
17+
[Plan]
18+
1. n + 1 크기의 list를 만든다.
19+
2. list[1] = 1, list[2] = 2를 대입한다.
20+
3. for-loop를 3부터 n까지 순회한다.
21+
3-1. Bottom-Top 방식으로 n까지 값을 채워간다.
22+
4. n값을 반환한다.
23+
24+
[Complexity]
25+
Time: O(n)
26+
Space: O(n)
27+
"""
28+
29+
30+
class Solution:
31+
def climbStairs(self, n: int) -> int:
32+
answer = [0, 1, 2]
33+
for index in range(3, n + 1):
34+
answer.append(answer[index - 1] + answer[index - 2])
35+
36+
return answer[n]
37+
38+
"""
39+
another solution
40+
ref: https://www.algodale.com/problems/climbing-stairs/
41+
[Summary]
42+
Bottom Top 방식인데 공간을 최적화하여 접근
43+
[Complexity]
44+
Time: O(n)
45+
Space: O(1) - Space Optimization
46+
47+
[Plan]
48+
1. prev = 1, cur = 2를 저장한다.
49+
2. for-loop를 순회한다. 3 to n + 1
50+
51+
"""
52+
53+
def climbStairs2(self, n: int) -> int:
54+
if n <= 3:
55+
return n
56+
57+
prev, cur = [2, 3]
58+
for index in range(4, n + 1):
59+
tmp = cur
60+
cur = cur + prev
61+
prev = tmp
62+
return cur
63+
64+
"""
65+
another solution
66+
ref: https://www.algodale.com/problems/climbing-stairs/
67+
[Summary]
68+
Top-Bottom으로 재귀적으로 접근
69+
[Complexity]
70+
Time: O(n)
71+
Space: O(n)
72+
"""
73+
74+
def climbStairs3(self, n: int) -> int:
75+
cache = {}
76+
77+
def dfs(num: int) -> int:
78+
nonlocal cache
79+
if num <= 3:
80+
return num
81+
if num in cache:
82+
return cache[num]
83+
cache[num] = dfs(num - 1) + dfs(num - 2)
84+
return cache[num]
85+
86+
return dfs(n)
87+
88+
89+
sol = Solution()
90+
91+
# Normal Case
92+
print(sol.climbStairs3(2) == 2)
93+
print(sol.climbStairs3(3) == 3)
94+
print(sol.climbStairs3(4) == 5)
95+
print(sol.climbStairs3(5) == 8)
96+
print(sol.climbStairs3(38))
97+
# Edge Case
98+
print(sol.climbStairs3(1) == 1)

climbing-stairs/mkwkw.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//Dynamic Programming
2+
//dp[n] = dp[n-1]+dp[n-2]
3+
class Solution {
4+
public:
5+
int climbStairs(int n) {
6+
int dp[46];
7+
8+
dp[0] = 0;
9+
dp[1] = 1;
10+
dp[2] = 2;
11+
12+
for(int i=3; i<=n; i++)
13+
{
14+
dp[i] = dp[i-1]+dp[i-2];
15+
}
16+
17+
return dp[n];
18+
19+
}
20+
};

contains-duplicate/yhkee0404.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Solution {
2+
fun containsDuplicate(nums: IntArray): Boolean {
3+
return nums.toSet()
4+
.size != nums.size
5+
}
6+
}

house-robber/yhkee0404.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
impl Solution {
2+
pub fn rob(nums: Vec<i32>) -> i32 {
3+
let mut dp = vec![0; nums.len() + 1];
4+
dp[1] = nums[0];
5+
for i in 2..dp.len() {
6+
dp[i] = dp[i - 1].max(dp[i - 2] + nums[i - 1]);
7+
}
8+
return *dp.last()
9+
.unwrap_or(&0)
10+
}
11+
}

0 commit comments

Comments
 (0)