Climbing Stairs
νκ΅μ΄
λΉμ μ κ³λ¨μ μ€λ₯΄κ³ μμ΅λλ€. μ μμ λλ¬νλ €λ©΄ nnn κ³λ¨μ μ¬λΌμΌ ν©λλ€.
ν λ²μ 1κ³λ¨ λλ 2κ³λ¨μ© μ€λ₯Ό μ μμ λ, μ μκΉμ§ λλ¬νλ μλ‘ λ€λ₯Έ λ°©λ²μ μλ λͺ κ°μ§μΈκ°μ?
1. λ¬Έμ λΆμ
κ³λ¨μ
n
κ°μ κ³λ¨μ μ¬λΌμΌν¨.ν λ²μ 1κ³λ¨ λλ 2κ³λ¨ μ€λ₯Ό μ μμ.
μ μκΉμ§ λλ¬νλ μλ‘ λ€λ₯Έ λ°©λ²μ μ λ₯Ό ꡬν΄μΌ ν¨.
2. μμ κ²½μ°λΆν° μκ°ν΄ 보기(ν¨ν΄ μ°ΎκΈ°)
κ³λ¨μ μ€λ₯΄λ λ°©λ²μ μμ μ«μλ‘ μ§μ μΈμ΄λ³΄λ©΄ κ·μΉμ΄ 보μ.
μμ 1: n = 1
λ°©λ²: (1)
β 1κ°μ§ λ°©λ²
μμ 2: n = 2
λ°©λ²: (1 + 1), (2)
β 2κ°μ§ λ°©λ²
μμ 3: n = 3
λ°©λ²: (1+1+1), (1+2), (2+1) β 3κ°μ§ λ°©λ²
μμ 4: n = 4
n = 4
λ°©λ²:
(1+1+1+1)
(1+1+2)
(1+2+1)
(2+1+1)
(2+2)
β 5κ°μ§ λ°©λ²
3. μ νμ(μ¬κ·μ) μ°ΎκΈ°
κ° μ«μμ κ²°κ³Όλ₯Ό 보면 μΌμ ν ν¨ν΄μ΄ 보μ.
n
λ°©λ²μ μ
1
1
2
2
3
3
4
5
5
8
6
13
ν¨ν΄ λ°κ²½ :
f(3) = f(2) + f(1) = 2 + 1 = 3
f(4) = f(3) + f(2) = 3 + 2 = 5
f(5) = f(4) + f(3) = 5 + 3 = 8
β μ¦, κ³λ¨ n
κ°λ₯Ό μ€λ₯΄λ λ°©λ²μ μλ λ€μκ³Ό κ°μ μ νμμ λ°λ¦
f(n-1)
: λ§μ§λ§μ1 κ³λ¨
μ μ¬λμ λμ κ²½μ°μ μf(n-2)
: λ§μ§λ§μ2 κ³λ¨
μ μ¬λμ λμ κ²½μ°μ μ
μ΄ μ νμμ νΌλ³΄λμΉ μμ΄ κ³Ό λμΌν ꡬ쑰μ
(λ¨, μ΄κΈ°κ° f(1) = 1
, f(2) = 2
)
4. μ μ¬κ·λ‘ ν μ μλκ°?
μ΄λ―λ‘,
n
μ ꡬνλ €λ©΄ λ¨Όμ n-1
κ³Όn-2
λ₯Ό κ³μ°ν΄μΌν¨.μ ꡬνλ €λ©΄ λ€μ μ μ΄ νμνκ³ , κ³μ μͺΌκ°μ§κ² λ¨.
λ°λΌμ, λ¬Έμ λ₯Ό μμ λ¬Έμ (
n-1
,n-2
λ±)λ‘ μͺΌκ°μ ν΄κ²°νλ "λΆν μ 볡(Divide & Conquer)" ννκ° λ¨.
μ¬κ· νΈμΆ ꡬ쑰 μμ(n = 5 μΌ λ)
climbStairs(5)
βββ climbStairs(4)
β βββ climbStairs(3)
β β βββ climbStairs(2) β 2
β β βββ climbStairs(1) β 1
β β βββ κ²°κ³Ό: 3
β βββ climbStairs(2) β 2
β βββ κ²°κ³Ό: 5
βββ climbStairs(3)
β βββ climbStairs(2) β 2
β βββ climbStairs(1) β 1
β βββ κ²°κ³Ό: 3
βββ κ²°κ³Ό: 8
5. μ¬κ· μ½λ
public class SlimbingStairs{
public static int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return climbStairs(n-1) + climbStairs(n - 2);
}
public static void main(String[] args) {
System.out.println(climbStairs(5)); // result : 8
}
}
6. λ λΉ λ₯Έ λ°©λ²(DP)
λ°λ³΅λ¬ΈμΌλ‘ O(n), O(1)
μ΅μ ν
public class ClimbingStairs {
public static int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
int first = 1;
int sencond = 2;
for (int i = 3; i <= n; i++) {
int third = first + second;
first = second;
second = third;
}
return second;
}
public static void main(String[] args) {
System.out.println(climbStairs(5)); // result : 8
}
}
Last updated
Was this helpful?