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

  • 방법:

    1. (1+1+1+1)

    2. (1+1+2)

    3. (1+2+1)

    4. (2+1+1)

    5. (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)=f(nβˆ’1)+f(nβˆ’2)f(n) = f(n-1) + f(n-2)

  • f(n-1) : λ§ˆμ§€λ§‰μ— 1 계단 을 μ˜¬λžμ„ λ•Œμ˜ 경우의 수

  • f(n-2) : λ§ˆμ§€λ§‰μ— 2 계단 을 μ˜¬λžμ„ λ•Œμ˜ 경우의 수

이 점화식은 ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄ κ³Ό λ™μΌν•œ κ΅¬μ‘°μž„

(단, μ΄ˆκΈ°κ°’ f(1) = 1, f(2) = 2 )

4. μ™œ μž¬κ·€λ‘œ ν’€ 수 μžˆλŠ”κ°€?

  • f(n)=f(nβˆ’1)+f(nβˆ’2)f(n) = f(n-1) + f(n-2) μ΄λ―€λ‘œ, n 을 κ΅¬ν•˜λ €λ©΄ λ¨Όμ € n-1 κ³Ό n-2 λ₯Ό 계산해야함.

  • f(nβˆ’1)f(n-1) 을 κ΅¬ν•˜λ €λ©΄ λ‹€μ‹œ f(nβˆ’2)f(n-2) 와 f(nβˆ’3)f(n-3) 이 ν•„μš”ν•˜κ³ , 계속 μͺΌκ°œμ§€κ²Œ 됨.

  • λ”°λΌμ„œ, 문제λ₯Ό μž‘μ€ 문제 (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?