Skip to content

Commit a5d6ab6

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents b5bce25 + 1c502dd commit a5d6ab6

36 files changed

+1524
-11
lines changed

β€Žclimbing-stairs/haklee.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""TC: O(n), SC: O(1)
2+
3+
아이디어:
4+
κ³„λ‹¨μ˜ k번째 μΉΈκΉŒμ§€ λ„λ‹¬ν•˜λŠ” λ°©λ²•μ˜ 수λ₯Ό f(k)라고 ν•˜μž.
5+
f(k)λŠ” λ‹€μŒμ˜ 두 경우의 수λ₯Ό λ”ν•œ 값이닀.
6+
- k-2번째 μΉΈκΉŒμ§€ κ°„ λ‹€μŒ 두 μΉΈ λœ€. 즉, f(k-2)
7+
- k-1번째 μΉΈκΉŒμ§€ κ°„ λ‹€μŒ 두 μΉΈ λœ€. 즉, f(k-1)
8+
즉, f(k) = f(k-2) + f(k-1)
9+
10+
11+
SC:
12+
- tabulation κ³Όμ •μ—μ„œ κ°’ 2개만 계속 μœ μ§€ν•œλ‹€.
13+
- 즉, O(1).
14+
15+
TC:
16+
- λ‹¨μˆœ λ§μ…ˆ 계산(O(1))을 O(n)번 λ°˜λ³΅ν•œλ‹€.
17+
- 즉, O(n).
18+
"""
19+
20+
21+
class Solution:
22+
def climbStairs(self, n: int) -> int:
23+
a, b = 1, 1
24+
for _ in range(n - 1):
25+
a, b = b, a + b
26+
return b

β€Žclimbing-stairs/highball.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const climbStairs = function (n) {
2+
const dp = [1, 1];
3+
4+
for (let i = 0; i < n - 1; i++) {
5+
const temp = dp[1];
6+
dp[1] = temp + dp[0];
7+
dp[0] = temp;
8+
}
9+
10+
return dp[1];
11+
};

β€Žclimbing-stairs/hwanmini.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// μ‹œκ°„λ³΅μž‘λ„ O(n)
2+
// κ³΅κ°„λ³΅μž‘λ„ O(n)
3+
4+
/**
5+
* @param {number} n
6+
* @return {number}
7+
*/
8+
var climbStairs = function(n) {
9+
const stairs = [1, 2]
10+
11+
for (let i = 2; i < n; i++) {
12+
stairs[i] = stairs[i-1] + stairs[i-2]
13+
}
14+
15+
return stairs[n-1]
16+
};
17+
18+
console.log(climbStairs(5))

β€Žclimbing-stairs/hyejjun.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* @param {number} n
3+
* @return {number}
4+
*/
5+
var climbStairs = function (n) {
6+
if (n <= 2) return n;
7+
8+
let first = 1;
9+
let second = 2;
10+
11+
for (let i = 3; i <= n; i++) {
12+
let third = first + second;
13+
first = second;
14+
second = third;
15+
}
16+
17+
return second;
18+
};
19+
20+
console.log(climbStairs(2));
21+
console.log(climbStairs(3));
22+
console.log(climbStairs(4));
23+
console.log(climbStairs(5));
24+
25+
/*
26+
μ‹œκ°„ λ³΅μž‘λ„: O(n)
27+
곡간 λ³΅μž‘λ„: O(1)
28+
*/

β€Žclimbing-stairs/jaejeong1.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class SolutionClimbStairs {
2+
3+
public int climbStairs(int n) {
4+
// n번째 κ³„λ‹¨κΉŒμ§€ 였λ₯΄λŠ” λ°©λ²•μ˜ 수
5+
// 첫 번째 κ³„λ‹¨κΉŒμ§€ 였λ₯΄λŠ” 방법은 1κ°€μ§€
6+
// 두 번째 κ³„λ‹¨κΉŒμ§€ 였λ₯΄λŠ” 방법은 2κ°€μ§€
7+
// μ„Έ 번째 κ³„λ‹¨λΆ€ν„°λŠ” 이전 두 κ³„λ‹¨μ˜ 방법을 λ”ν•˜μ—¬ 계산
8+
// stairs[i]λŠ” i번째 κ³„λ‹¨κΉŒμ§€ 였λ₯΄λŠ” λ°©λ²•μ˜ 수
9+
// μ‹œκ°„λ³΅μž‘λ„: O(N), κ³΅κ°„λ³΅μž‘λ„: O(N)
10+
if (n == 1) {
11+
return 1;
12+
}
13+
14+
if (n == 2) {
15+
return 2;
16+
}
17+
18+
int[] stairs = new int[n+1];
19+
stairs[1] = 1;
20+
stairs[2] = 2;
21+
22+
23+
for (int i=3; i<=n; i++) {
24+
stairs[i] = stairs[i-1] + stairs[i-2];
25+
}
26+
27+
return stairs[n];
28+
}
29+
}

β€Žclimbing-stairs/kayden.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# μ‹œκ°„λ³΅μž‘λ„: O(N)
2+
# κ³΅κ°„λ³΅μž‘λ„: O(N)
3+
class Solution:
4+
def climbStairs(self, n: int) -> int:
5+
dp = [0] * (n + 1)
6+
dp[0] = 1
7+
dp[1] = 1
8+
9+
for i in range(2, n + 1):
10+
dp[i] = dp[i - 1] + dp[i - 2]
11+
12+
return dp[n]

β€Žclimbing-stairs/seona926.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* @param {number} n
3+
* @return {number}
4+
*/
5+
let climbStairs = function (n) {
6+
if (n <= 1) return 1;
7+
8+
let ways = new Array(n + 1);
9+
ways[0] = 1;
10+
ways[1] = 1;
11+
12+
for (let i = 2; i <= n; i++) {
13+
ways[i] = ways[i - 1] + ways[i - 2]; // 점화식 μ‚¬μš©
14+
}
15+
16+
return ways[n];
17+
};
18+
19+
/*
20+
1. μ‹œκ°„ λ³΅μž‘λ„: O(n)
21+
- for λ£¨ν”„μ˜ μ‹œκ°„ λ³΅μž‘λ„
22+
2. 곡간 λ³΅μž‘λ„: O(n)
23+
- λ°°μ—΄ ways의 곡간 λ³΅μž‘λ„
24+
*/

β€Žclimbing-stairs/whewchews.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* 아이디어
3+
* 측수 μ œν•œ: 1 <= n <= 45
4+
* 1 or 2 step 만 올라갈 수 있음
5+
6+
* 1 -> [1]
7+
* 2 -> [1,1] [2]
8+
* 3 -> [1,1,1] [2,1] [1,2]
9+
* 4 -> [1,1,1,1] [2,1,1] [1,2,1] [1,1,2] [2,2]
10+
* 5 -> [1,1,1,1,1] [2,1,1,1] [1,2,1,1] [1,1,2,1] [1,1,1,2] [2,2,1], [1,2,2], [2,1,2]
11+
* 6 -> [1,1,1,1,1,1] [2,1,1,1,1] [...] [1,1,1,1,2] [2,2,1,1], [2,1,2,1], [2,1,1,2] [1,1,2,2], [1,2,1,2], [1,2,2,1]
12+
=> (1:n, 2:0) nκ°€μ§€ (1:n-2, 2:1) / nκ°€μ§€ (1: n-4, 2: n/2) C(n, n/2) κ°€μ§€
13+
*/
14+
function climbStairs(n: number): number {
15+
// # Solution 1
16+
17+
// const stair = {1: 1, 2:2}
18+
// for(let i = 3; i<=n; i++){
19+
// stair[i] = stair[i-1] + stair[i-2]
20+
// }
21+
// TC: O(N)
22+
// SC: O(N)
23+
24+
// # Solution 2
25+
26+
// if(n < 3) return n
27+
// let curr = 2 // ν˜„μž¬ 계단을 였λ₯΄λŠ” 방법 수
28+
// let prev = 1 // 이전 계단을 였λ₯΄λŠ” 방법 수
29+
30+
// for(let i=0; i<n-2; i++){
31+
// const next = prev + curr;
32+
// prev = curr;
33+
// curr = next;
34+
// }
35+
36+
// return curr
37+
// TC: O(N)
38+
// SC: O(1)
39+
40+
// # Solution 3: μž¬κ·€
41+
const memo = { 1: 1, 2: 2 };
42+
function calculateClimbingWay(n, memo) {
43+
if (n in memo) return memo[n];
44+
45+
if (n < 3) {
46+
return n;
47+
}
48+
memo[n] =
49+
calculateClimbingWay(n - 1, memo) + calculateClimbingWay(n - 2, memo);
50+
51+
return memo[n];
52+
}
53+
return calculateClimbingWay(n, memo);
54+
// TC: O(N)
55+
// SC: O(N)
56+
}

β€Žclimbing-stairs/wogha95.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// DP ν™œμš©ν•˜μ˜€κ³  λ©”λͺ¨λ¦¬ μΆ•μ†Œλ₯Ό μœ„ν•΄ ν˜„μž¬μ™€ μ§μ „μ˜ 경우의 수만 κ΄€λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
2+
// TC: O(N)
3+
// SC: O(1)
4+
5+
/**
6+
* @param {number} n
7+
* @return {number}
8+
*/
9+
var climbStairs = function (n) {
10+
let previousStep = 0;
11+
let currentStep = 1;
12+
13+
while (n > 0) {
14+
n -= 1;
15+
const nextStep = previousStep + currentStep;
16+
previousStep = currentStep;
17+
currentStep = nextStep;
18+
}
19+
20+
return currentStep;
21+
};

β€Žcoin-change/haklee.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"""TC: O(m*n), SC: O(n)
2+
3+
coin μ’…λ₯˜: m
4+
amount 크기: n
5+
6+
아이디어:
7+
κ°’ kλ₯Ό λ§Œλ“€λ•Œ ν•„μš”ν•œ μ΅œμ†Œ λ™μ „μ˜ 수λ₯Ό f(k)라고 ν•˜μž.
8+
f(k)λŠ” λ‹€μŒμ˜ 경우 쀑 제일 μž‘μ€ 값이닀.
9+
- 동전 c1을 λ§ˆμ§€λ§‰μœΌλ‘œ λ”ν•΄μ„œ kλ₯Ό λ§Œλ“€μ—ˆλ‹€. f(k-c1) + 1개의 동전 ν•„μš”.
10+
- 동전 c2을 λ§ˆμ§€λ§‰μœΌλ‘œ λ”ν•΄μ„œ kλ₯Ό λ§Œλ“€μ—ˆλ‹€. f(k-c2) + 1개의 동전 ν•„μš”.
11+
- ...
12+
- 동전 cm을 λ§ˆμ§€λ§‰μœΌλ‘œ λ”ν•΄μ„œ kλ₯Ό λ§Œλ“€μ—ˆλ‹€. f(k-cm) + 1개의 동전 ν•„μš”.
13+
즉, f(k) = min(f(k-c1), f(k-c2), ..., f(k-cm)) + 1
14+
15+
μ΄λ•Œ, n보닀 μž‘μ€ λͺ¨λ“  i에 λŒ€ν•΄μ„œ ν•œ 번 f(i)값을 계산할 일이 μžˆμ—ˆμœΌλ©΄ 이λ₯Ό μ €μž₯해두고 μ‚¬μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ
16+
μ ‘κ·Όν•΄μ„œ 문제λ₯Ό ν’€ 수 μžˆλ‹€.
17+
18+
SC:
19+
- n보닀 μž‘μ€ λͺ¨λ“  i에 λŒ€ν•΄ f(i)값을 μ €μž₯ν•΄λ‘λŠ” λ°°μ—΄ ν•„μš”.
20+
- 즉, O(n).
21+
22+
TC:
23+
- 각 f(i)λ§ˆλ‹€ 졜초 κ³„μ‚°μ‹œ m개의 μ•„μ΄ν…œμ„ list에 λ„£κ³  min값을 μ°ΎλŠ” 계산을 ν•œ 번 ν•œλ‹€. O(m).
24+
- 졜초 계산이 아닐 경우 배열에 μ €μž₯된 값을 κ°€μ Έμ˜¨λ‹€. O(1).
25+
- 각 f(i)λŠ” f(i+c1), f(i+c2), ..., f(i+cm)을 κ³„μ‚°ν• λ•Œ ν˜ΈμΆœλ˜λŠ”λ°, 여기에 O(m) + O(1) + ... + O(1)
26+
만큼의 μ‹œκ°„μ΄ μ†Œμš”λ˜λ―€λ‘œ μ’…ν•©ν•˜λ©΄ O(m) + (m+1)*O(1) = O(m) 만큼의 μ‹œκ°„μ΄ μ†Œμš”λœλ‹€.
27+
- μ΄λŸ¬ν•œ f(i)값이 총 n개 μžˆλ‹€. 즉, O(m*n).
28+
"""
29+
30+
31+
class Solution:
32+
def coinChange(self, coins: List[int], amount: int) -> int:
33+
arr = [None for _ in range(amount + 1)] # None값은 아직 κ³„μ‚°λ˜μ§€ μ•Šμ•˜λ‹€λŠ” 뜻.
34+
arr[0] = 0 # μ΄ˆκΈ°ν™”
35+
36+
def dp(target):
37+
if arr[target] is None: # λ§Œμ•½ 아직 f(target)이 κ³„μ‚°λ˜μ§€ μ•Šμ•˜λ‹€λ©΄
38+
# λͺ¨λ“  동전듀 c에 λŒ€ν•΄ f(target - c)λŠ” λ‹€μŒμ˜ κ²½μš°λ“€λ§Œ μœ νš¨ν•˜λ‹€.
39+
# - target이 동전 c의 크기 이상은 λ˜μ–΄μ•Ό ν•œλ‹€.
40+
# - μ•žμ„œ 계산해본 κ²°κ³Ό 총 κΈˆμ•‘ target - cλ₯Ό ꡬ할 수 μ—†λŠ” κ²½μš°λŠ” λ¬΄μ‹œ.
41+
# - ꡬ할 수 μ—†λŠ” κ²ƒμœΌλ‘œ 판λͺ…λœ 경우 f(x)의 값이 -1이닀.
42+
candidates = [
43+
v for c in coins if target - c >= 0 and (v := dp(target - c)) >= 0
44+
]
45+
# candidates에 μœ νš¨ν•œ f(target - c)값이 ν•˜λ‚˜λ„ μ—†μœΌλ©΄ f(target)은 -1이닀.
46+
# 그게 μ•„λ‹ˆλΌλ©΄ candidates에 λ“€μ–΄μžˆλŠ” κ°’ 쀑 제일 적은 수의 동전을 ν•„μš”λ‘œ ν•˜λŠ”
47+
# κ²½μš°μ— 1을 λ”ν•œ 값을 f(target)에 λ„£μ–΄λ‘ .
48+
arr[target] = -1 if len(candidates) == 0 else min(candidates) + 1
49+
return arr[target]
50+
51+
return dp(amount)

0 commit comments

Comments
Β (0)