Skip to content

Commit 5988116

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 13b9ddb + edddfe9 commit 5988116

Some content is hidden

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

83 files changed

+2774
-6
lines changed

3sum/sora0319.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,4 @@ public List<List<Integer>> threeSum(int[] nums) {
3535
}
3636
}
3737

38+

coin-change/devyejin.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# # 중복조합
2+
# class Solution:
3+
# def coinChange(self, coins: List[int], amount: int) -> int:
4+
#
5+
# def backtrack(current, total):
6+
# if total == amount:
7+
# return len(current)
8+
#
9+
# if total > amount:
10+
# return float('inf')
11+
#
12+
# min_count = float('inf')
13+
# for coin in coins:
14+
# current.append(coin)
15+
# result = backtrack(current, total + coin)
16+
# min_count = min(min_count, result)
17+
# current.pop()
18+
#
19+
# return min_count
20+
#
21+
# ans = backtrack([], 0)
22+
# return -1 if ans == float('inf') else ans
23+
from collections import deque
24+
from typing import List
25+
26+
class Solution:
27+
def coinChange(self, coins: List[int], amount: int) -> int:
28+
if amount == 0:
29+
return 0
30+
31+
queue = deque([(0, 0)])
32+
visited = set([0])
33+
34+
while queue:
35+
current_amount, count = queue.popleft()
36+
37+
for coin in coins:
38+
new_amount = current_amount + coin
39+
if new_amount == amount:
40+
return count + 1
41+
if new_amount < amount and new_amount not in visited:
42+
visited.add(new_amount)
43+
queue.append((new_amount, count + 1))
44+
45+
return -1
46+
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
2+
//1. top-down
3+
var coinChange = function(coins, amount) {
4+
if(amount == 0 ) return 0
5+
/*
6+
점화식 : dp[n] = Math.min(dp[n],dp[n-k]+1)
7+
*/
8+
const dp = new Array(amount+1).fill(Math.pow(10,4));
9+
for(let c of coins){
10+
dp[c] = 1
11+
}
12+
function dfs(idx,coin){
13+
if(idx + coin > amount) return
14+
dp[idx+coin] = Math.min(dp[idx+coin],dp[idx]+1)
15+
if(idx + coin == amount){
16+
return
17+
}else{
18+
for(let c of coins){
19+
dfs(idx+coin,c)
20+
}
21+
}
22+
}
23+
dfs(0,coins[0])
24+
25+
if(dp[amount] > amount) return -1
26+
27+
return dp[amount]
28+
29+
};
30+
31+
// 타임리밋에 걸린다. dfs의 가지치기가 덜 되어서 그렇다.
32+
// 그렇다면, 순차적인 dp를 좀더 활용하는 것이 좋아보인다. 현재로서는 메모이제이션의 이점을 제대로 활용할 수 없어보인다.
33+
34+
35+
36+
//2. bottom-up
37+
var coinChange = function(coins, amount) {
38+
coins = coins.filter(x=> x<=amount)
39+
if(amount == 0) return 0
40+
/*
41+
점화식 : dp[n] = Math.min(dp[n],dp[n-k]+1)
42+
*/
43+
const dp = new Array(amount+1).fill(Math.pow(10,4)+1);
44+
dp[0] = 0
45+
//dfs를 쓰고 싶지 않다면, amount만큼의 for문을 돌면서 dp를 초기화해주면 된다.
46+
for(let i=1; i <amount+1; i++){
47+
for(let coin of coins){
48+
if(i-coin >= 0){
49+
dp[i] = Math.min(dp[i-coin] + 1,dp[i])
50+
}
51+
}
52+
}
53+
if(dp[amount] > amount) return -1
54+
return dp[amount]
55+
56+
};
57+
58+
/**
59+
dfs를 쓰고 싶지 않다면, amount만큼의 for문을 돌면서 dp를 초기화해주면 된다.
60+
처음에 coins = coins.filter(x=> x<=amount)
61+
이렇게 쓴 이유는, amount보다 작은 코인만 필터하여 최적화한다.
62+
63+
이 문제 풀이 소요시간이 1시간이 넘었는데,
64+
그 이유가, i-coin이 아니라, i+coin을 기준을 삼았었다.
65+
그러다보니 그러다 보니 각 금액 `i`의 최솟값을 찾기 위해 `dp[i]`를 `dp[i-coin]` 기반으로 갱신해야 한다는 핵심적인 아이디어를 적용하기 어려웠다.
66+
`dp[i+coin]` 방식으로 접근하면, `dp[i]` 자체가 아직 최적의 상태가 아닌데도 그 값을 기반으로 미래의 `dp[i+coin]`을 업데이트하려 하기 때문에, 정확한 최적해를 찾아내기 어려웠다.
67+
현재 금액 `i`를 만들기 위한 가장 효율적인 방법을 과거의 `dp[i-coin]`에서 찾는 '바텀업(Bottom-Up)' 방식이 이 문제에 훨씬 적합하다는 것을 깨닫는 데 시간이 걸렸다.
68+
69+
70+
71+
시간복잡도: O(n * m)
72+
공간 복잡도 : O(n)
73+
*/

coin-change/hoyeongkwak.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
Time Complexity : O(n)
3+
Space Complexity : O(n)
4+
*/
5+
6+
class Solution {
7+
public int coinChange(int[] coins, int amount) {
8+
if (amount == 0) return 0;
9+
int[] dp = new int[amount + 1];
10+
Arrays.fill(dp, Integer.MAX_VALUE);
11+
dp[0] = 0;
12+
for (int coin : coins) {
13+
for (int i = coin; i <= amount; i++) {
14+
if (dp[i - coin] != Integer.MAX_VALUE) {
15+
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
16+
}
17+
}
18+
}
19+
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
20+
}
21+
}

coin-change/hu6r1s.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from collections import deque
2+
3+
class Solution:
4+
"""
5+
1. 가장 큰 수부터 차례대로 빼면서 확인 - 틀린 풀이
6+
가장 큰 수부터 차례대로 빼면 안되는 경우가 있음
7+
coins = [186,419,83,408], amount = 6249
8+
이건 419부터 안될때까지 빼는 방식으로 되지 않음, 즉 최적의 금액을 찾아야 함.
9+
그리디 같은 문제일 듯
10+
11+
"""
12+
"""
13+
def coinChange(self, coins: List[int], amount: int) -> int:
14+
if amount == 0:
15+
return 0
16+
17+
coins.sort(reverse=True)
18+
result = 0
19+
for coin in coins:
20+
while amount >= coin:
21+
amount -= coin
22+
result += 1
23+
24+
if amount:
25+
return -1
26+
return result
27+
"""
28+
"""
29+
- BFS를 사용하여 "동전 합"을 0에서 시작해 amount까지 도달하는 최소 단계를 탐색
30+
- 큐의 원소: (cnt, total)
31+
cnt : 현재까지 사용한 동전 개수
32+
total : 현재까지 만든 합
33+
- visited 집합으로 이미 방문한 합을 중복 탐색하지 않게 함
34+
- 첫 번째로 amount에 도달하는 순간이 최소 동전 개수 (BFS 특성상)
35+
36+
시간 복잡도:
37+
- 최악의 경우 모든 합(0 ~ amount)을 탐색하며,
38+
각 합에서 최대 len(coins)개의 새로운 상태를 큐에 넣음
39+
- O(amount × n), n = len(coins)
40+
41+
공간 복잡도:
42+
- visited 집합: 최대 amount+1 크기
43+
- 큐(queue): 최악의 경우 O(amount × n) 상태 저장 가능
44+
- O(amount)
45+
"""
46+
def coinChange(self, coins: List[int], amount: int) -> int:
47+
def bfs():
48+
queue = deque([(0, 0)])
49+
visited = set()
50+
while queue:
51+
cnt, total = queue.popleft()
52+
if amount == total:
53+
return cnt
54+
if total in visited:
55+
continue
56+
visited.add(total)
57+
58+
for coin in coins:
59+
if coin + total <= amount:
60+
queue.append((cnt + 1, total + coin))
61+
return -1
62+
63+
return bfs()

coin-change/hyer0705.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
function coinChange(coins: number[], amount: number): number {
2+
// dp[i] = i 금액을 만드는 데 필요한 최소 동전의 갯수...
3+
const dp: number[] = Array(amount + 1).fill(Infinity);
4+
dp[0] = 0;
5+
6+
for (let i = 1; i <= amount; i++) {
7+
let min = Infinity;
8+
for (const coin of coins) {
9+
if (i >= coin) {
10+
min = Math.min(dp[i - coin] + 1, min);
11+
}
12+
}
13+
dp[i] = min;
14+
}
15+
16+
return Number.isFinite(dp[amount]) ? dp[amount] : -1;
17+
}

coin-change/hyunjung-choi.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* 시간복잡도: O(amount × coins.length)
3+
* 공간복잡도: O(amount)
4+
*/
5+
6+
class Solution {
7+
fun coinChange(coins: IntArray, amount: Int): Int {
8+
val dp = IntArray(amount + 1) { Int.MAX_VALUE }
9+
dp[0] = 0
10+
11+
for (i in 1..amount) {
12+
for (coin in coins) {
13+
if (i - coin >= 0 && dp[i - coin] != Int.MAX_VALUE) {
14+
dp[i] = minOf(dp[i], dp[i - coin] + 1)
15+
}
16+
}
17+
}
18+
19+
return if (dp[amount] == Int.MAX_VALUE) -1 else dp[amount]
20+
}
21+
}

coin-change/jinvicky.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import java.util.Arrays;
2+
3+
class Solution {
4+
public int coinChange(int[] coins, int amount) {
5+
int max=amount+1;
6+
int [] dp=new int[amount+1];
7+
Arrays.fill(dp,max);
8+
dp[0]=0;
9+
for(int coin:coins){
10+
for(int j=coin;j<=amount;j++){ // coin부터 시작해서 일반 루프보다 성능 향상
11+
dp[j]=Math.min(dp[j],dp[j-coin]+1);
12+
}
13+
}
14+
return dp[amount]>amount ? -1:dp[amount];
15+
}
16+
}

coin-change/jun0811.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
var coinChange = function(coins, amount) {
2+
if(amount == 0) return 0
3+
4+
const dp = [0, ...new Array(amount).fill(amount+1)]
5+
6+
for (const coin of coins) {
7+
for (let i = coin; i <=amount; i++) {
8+
dp[i] = Math.min(dp[i], dp[i-coin] + 1)
9+
}
10+
}
11+
12+
return dp[amount] < amount+1 ? dp[amount] : -1
13+
};

coin-change/sora0319.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ public int coinChange(int[] coins, int amount) {
1919
}
2020

2121

22+

0 commit comments

Comments
 (0)