Skip to content

Commit 963eaf4

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 469b409 + 94473f0 commit 963eaf4

140 files changed

Lines changed: 3638 additions & 14 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

โ€Ž3sum/soobing3.tsโ€Ž

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
function threeSum(nums: number[]): number[][] {
2+
const result: number[][] = []
3+
4+
nums.sort((a: number, b: number) => a-b);
5+
for(let i = 0; i<nums.length; i++) {
6+
if (i > 0 && nums[i] === nums[i - 1]) continue;
7+
let left = i + 1;
8+
let right = nums.length - 1;
9+
10+
while(left < right) {
11+
const sum = nums[i] + nums[left] + nums[right];
12+
if(sum === 0) {
13+
result.push([nums[i], nums[left], nums[right]])
14+
while (left < right && nums[left] === nums[left + 1]) left++;
15+
while (left < right && nums[right] === nums[right - 1]) right--;
16+
17+
left++;
18+
right--;
19+
} else if(sum < 0) {
20+
left++;
21+
} else {
22+
right--;
23+
}
24+
}
25+
}
26+
return result;
27+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* @param {number} n
3+
* @return {number}
4+
*/
5+
6+
var climbStairs = function (n) {
7+
if (n === 1) return 1;
8+
if (n === 2) return 2;
9+
const arr = [0, 1, 2];
10+
let i = 3;
11+
while (i <= n) {
12+
const temp = arr[i - 1] + arr[i - 2];
13+
arr.push(temp);
14+
i++;
15+
}
16+
17+
return arr[n];
18+
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
function climbStairs(n: number): number {
2+
const memo = new Map<number, number>();
3+
4+
function dp (n: number): number {
5+
if(n <= 1) return 1;
6+
if(memo.has(n)) return memo.get(n)!;
7+
8+
const result = dp(n-1) + dp(n-2);
9+
memo.set(n, result);
10+
return result;
11+
}
12+
13+
return dp(n);
14+
};

โ€Žcoin-change/gcount85.pyโ€Ž

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""
2+
# Intuition
3+
dp[n]์€ n์›์„ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜
4+
e.g. n = 11์ผ ๋•Œ, 11์›์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜๋Š” 11์—์„œ coins์˜ ์›์†Œ๋ฅผ ๋บ€ dp ๊ฐ’ + 1์ด๋‹ค.
5+
6+
# Complexity
7+
- Time complexity: O(amount * coins.length)์ธ๋ฐ, coins ๋ฐฐ์—ด ๊ธธ์ด๊ฐ€ ์ƒ์ˆ˜๋ผ์„œ ๋ฌด์‹œ => O(amount)
8+
9+
- Space complexity: dp ๋ฐฐ์—ด ์ƒ์„ฑ์œผ๋กœ O(amount)
10+
"""
11+
12+
13+
class Solution:
14+
def coinChange(self, coins: list[int], amount: int) -> int:
15+
coins.sort()
16+
INF = float("inf")
17+
dp = [INF] * (amount + 1)
18+
dp[0] = 0
19+
for i in range(amount + 1):
20+
if dp[i] == INF:
21+
continue
22+
for c in coins:
23+
if i + c > amount:
24+
break
25+
dp[i + c] = min(dp[i + c], dp[i] + 1)
26+
return dp[-1] if dp[-1] != INF else -1

โ€Žcoin-change/hwi-middle.cppโ€Ž

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
public:
3+
int coinChange(vector<int>& coins, int amount) {
4+
if (amount < 1)
5+
{
6+
return 0;
7+
}
8+
9+
vector<int> v(amount);
10+
return solve(coins, amount, v);
11+
}
12+
13+
int solve(vector<int>& coins, int amount, vector<int>& count)
14+
{
15+
if (amount < 0) return -1;
16+
if (amount == 0) return 0;
17+
if (count[amount - 1] != 0) return count[amount - 1];
18+
19+
int min = INT_MAX;
20+
for (int coin : coins)
21+
{
22+
int res = solve(coins, amount - coin, count); // coin์„ ์‚ฌ์šฉ
23+
if (res >= 0 && res < min) // ๊ฒฐ๊ณผ๊ฐ€ ์œ ํšจํ•˜๊ณ  ํ˜„์žฌ ์ตœ์†Ÿ๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด ์—…๋ฐ์ดํŠธ
24+
{
25+
min = res + 1; // coin์„ ๋ฏธ๋ฆฌ ์‚ฌ์šฉํ•˜๊ณ  ์ฐพ์€ ๊ฐ’์ด๋ฏ€๋กœ 1 ๋”ํ•จ
26+
}
27+
}
28+
29+
count[amount - 1] = (min == INT_MAX) ? -1 : min;
30+
return count[amount - 1];
31+
}
32+
};

โ€Žcoin-change/liza0525.pyโ€Ž

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 7๊ธฐ ํ’€์ด
2+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n * k)
3+
# - ํƒ€๊ฒŸ ์ฝ”์ธ ๊ฐ’(amount, ๋ณต์žก๋„ ๊ณ„์‚ฐ์—์„  n์œผ๋กœ ํ‘œ๊ธฐ)๊ณผ coins์˜ ๊ธธ์ด ๋งŒํผ ํƒ์ƒ‰ํ•˜๋ฉฐ ๊ณ„์‚ฐ
4+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
5+
# - ํƒ€๊ฒŸ ์ฝ”์ธ ๊ฐ’(amount, ๋ณต์žก๋„ ๊ณ„์‚ฐ์—์„  n์œผ๋กœ ํ‘œ๊ธฐ) ๋งŒํผ์˜ min_coin_count ๊ณ„์‚ฐ array๋ฅผ ์ƒ์„ฑ
6+
class Solution:
7+
# ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํ˜„์žฌ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ˆ์œผ๋กœ ๊ฐ ์ฝ”์ธ ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๋ฐ์— ๋™์ „์„ ์–ผ๋งˆ๋‚˜ ์“ฐ๋Š”์ง€ ๊ณ„์‚ฐํ•˜์—ฌ
8+
# ๊ทธ ์กฐํ•ฉ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ณ„์† ์ฐพ์•„๊ฐ€๋Š” ๋ฌธ์ œ๋กœ, min_coin_count๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
9+
def coinChange(self, coins: List[int], amount: int) -> int:
10+
min_coin_count = [-1 for _ in range(amount + 1)] # ๊ฐ ์ธ๋ฑ์Šค๋Š” ์ฝ”์ธ ๊ฐ’, value๋Š” ํ•ด๋‹น ์ฝ”์ธ ๊ฐ’์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋™์ „์˜ ๊ฐœ์ˆ˜(๋งŒ๋“ค ์ˆ˜ ์—†์„ ๋• -1)
11+
min_coin_count[0] = 0 # ์ฝ”์ธ ๊ฐ’์ด 0์ผ ๋•Œ๋Š” ๋™์ „์„ ์“ฐ์ง€ ์•Š์œผ๋ฉด ๋˜๋ฏ€๋กœ ๋ฌด์กฐ๊ฑด 0์ด ๋œ๋‹ค.
12+
13+
for target_amount in range(1, len(min_coin_count)):
14+
# ๊ฐ ์ฝ”์ธ ๊ฐ’์— ๋Œ€ํ•ด ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.
15+
for coin in coins:
16+
if target_amount - coin < 0:
17+
# ๋Œ€์ƒ ์ฝ”์ธ ๊ฐ’๋ณด๋‹ค ์ฒดํฌํ•  ์ฝ”์ธ ๊ฐ’์ด ํฐ ๊ฒฝ์šฐ์—๋Š” ์กฐํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋„˜๊ธด๋‹ค
18+
continue
19+
if min_coin_count[target_amount - coin] < 0:
20+
# target_amount - coin(๋ณด์ˆ˜)์„ ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฉด target_amount๋„ ๋งŒ๋“ค ์ˆ˜ ์—†์Œ
21+
# ์˜ˆ์‹œ) target=5, coin=3 โ†’ ๋ณด์ˆ˜ 2๋ฅผ ๋ชป ๋งŒ๋“ค๋ฉด 5๋„ ๋ชป ๋งŒ๋“ฆ
22+
continue
23+
24+
# ์œ„ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด๋งŒ ๋„˜์–ด๊ฐ€๋ฉด ๋™์ „ ๊ฐœ์ˆ˜๋ฅผ min_coin_count[target_amount]์— ์ •ํ•ด์„œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ
25+
if min_coin_count[target_amount] == -1:
26+
# ๊ฐ’์ด -1์ธ ๊ฒฝ์šฐ์—๋Š” ์ฒ˜์Œ์œผ๋กœ ๊ณ„์‚ฐํ•ด์„œ ๋„ฃ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—
27+
# min_coin_count[target_amount - coin]์—๋‹ค๊ฐ€ 1์„ ๋”ํ•ด์„œ(coin ํ•œ ๊ฐœ๋ฅผ ์ถ”๊ฐ€ ํ•œ๋‹ค๋Š” ์˜๋ฏธ) min_coin_count[target_amount]์— ํ• ๋‹น
28+
min_coin_count[target_amount] = min_coin_count[target_amount - coin] + 1
29+
else:
30+
# ๊ฐ’์ด -1์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ์ด์ „์— ์ €์žฅ๋œ ๋™์ „ ๊ฐœ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ
31+
# ์ด์ „ ๊ฒฐ๊ณผ ๊ฐ’๊ณผ min_coin_count[target_amount - coin] + 1์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋” ์ ์€ ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
32+
min_coin_count[target_amount] = min(
33+
min_coin_count[target_amount],
34+
min_coin_count[target_amount - coin] + 1
35+
)
36+
37+
# ๋ชจ๋‘ ๊ณ„์‚ฐํ•œ ํ›„ min_coin_count[amount]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (== amount๋ฅผ ๋งŒ๋“œ๋Š” ๋™์ „์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜)
38+
return min_coin_count[amount]
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// ! ๋‚˜์ค‘์— ๋‹ค์‹œ ํ’€์–ด์•ผ ํ•  ๋ฌธ์ œ
2+
//! 30๋ถ„ ๋‚ด์— ํ’€์ง€ ๋ชปํ•ด์„œ AI์˜ ๋„์›€์„ ๋ฐ›์•„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค..
3+
// recursion์˜ ์‚ฌ์šฉ, ์ข…๋ฃŒ ์กฐ๊ฑด ๋“ฑ ์–ด๋А์ •๋„ ๊ทผ์ ‘ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ,
4+
// idx๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๊ณ  number๋ฅผ ์ง์ ‘ ๋„˜๊ธฐ๋ ค๊ณ  ํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋‚˜, results pop์„ ๋†“์ณค๋˜ ๋ถ€๋ถ„ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
5+
const combinationSum = function (candidates, target) {
6+
const answer = [];
7+
8+
function recursion(idx, target, results = []) {
9+
if (target === 0) {
10+
answer.push([...results]);
11+
return;
12+
}
13+
if (target < 0) return;
14+
15+
for (let i = idx; i < candidates.length; i++) {
16+
results.push(candidates[i]);
17+
recursion(i, target - candidates[i], results);
18+
results.pop();
19+
}
20+
}
21+
recursion(0, target, []);
22+
23+
return answer;
24+
};
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# https://leetcode.com/problems/combination-sum/
2+
3+
# for๋ฌธ์œผ๋กœ ํ•ด๊ฒฐ์ด ๋˜์ง€ ์•Š์•„ gpt ๋„์›€์„ ๋ฐ›์•„ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.
4+
# ๊ฐ™์€ ์ˆซ์ž๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด์„œ, ์ˆœ์„œ๋ฅผ ๊ณ ์ •ํ•ด์„œ ์ค‘๋ณต ์—†๋Š” ์กฐํ•ฉ์„ DFS๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ตฌ์กฐ
5+
# ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(2^n) (๋ฐฑํŠธ๋ž˜ํ‚น ํƒ์ƒ‰)
6+
# ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(target) (์žฌ๊ท€ ๊นŠ์ด)
7+
8+
class Solution(object):
9+
def combinationSum(self, candidates, target):
10+
11+
result = []
12+
13+
def dfs(start, path, total):
14+
# ์ข…๋ฃŒ ์กฐ๊ฑด 1 : target์„ ๋งž์ถ˜ ๊ฒฝ์šฐ
15+
if total == target:
16+
result.append(path[:])
17+
return
18+
19+
# ์ข…๋ฃŒ ์กฐ๊ฑด 2 : target ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ
20+
if total > target:
21+
return
22+
23+
# ํ›„๋ณด ํƒ์ƒ‰ -> ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ํƒ์ƒ‰
24+
for i in range(start, len(candidates)):
25+
# ๊ฐ™์€ ์ˆซ์ž ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ -> i๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๊ธฐ
26+
dfs(i, path+[candidates[i]], total+candidates[i]) # ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค์–ด์„œ ์ „๋‹ฌ
27+
28+
29+
dfs(0, [], 0)
30+
31+
return result
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import java.util.ArrayList;
2+
import java.util.List;
3+
4+
class Solution {
5+
// TC : O(n!) => TC : O(2^T)
6+
// SC : O(n^2) => SC : O(T)
7+
ArrayList<List<Integer>> result = new ArrayList<>();
8+
9+
public List<List<Integer>> combinationSum(int[] candidates, int target) {
10+
backtrack(0, target, candidates, new ArrayList<>());
11+
return result;
12+
}
13+
14+
private void backtrack(int start, int diff, int[] candidates, ArrayList<Integer> path) {
15+
if (diff == 0) {
16+
result.add(new ArrayList<>(path)); // ๊นŠ์€ ๋ณต์‚ฌ
17+
return;
18+
}
19+
20+
if (diff < 0) {
21+
return;
22+
}
23+
24+
for (int i = start; i < candidates.length; i++) {
25+
path.add(candidates[i]);
26+
backtrack(i, diff - candidates[i], candidates, path);
27+
path.remove(path.size() - 1);
28+
}
29+
}
30+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"""
2+
# Intuition
3+
backtracking
4+
5+
# Complexity
6+
- Time complexity: N์„ ๊นŠ์ด๋งŒํผ ๊ณฑํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์„ ๋•Œ, O(N^(T/M))
7+
N = candidates ๊ฐœ์ˆ˜
8+
T = target
9+
M = candidates ์ค‘ ์ตœ์†Œ๊ฐ’
10+
11+
- Space complexity: O(T/M)
12+
"""
13+
14+
15+
class Solution:
16+
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
17+
candidates.sort()
18+
answer = []
19+
output = []
20+
21+
def dfs(cur_i, cur_sum):
22+
if cur_sum == target:
23+
answer.append(output[:])
24+
return
25+
26+
for i in range(cur_i, len(candidates)):
27+
num = candidates[i]
28+
29+
if cur_sum + num > target:
30+
break
31+
32+
output.append(num)
33+
dfs(i, cur_sum + num)
34+
output.pop()
35+
36+
dfs(0, 0)
37+
return answer

0 commit comments

Comments
ย (0)