Published:
Updated:

  • Reference
  • μ‹œκ°„λ³΅μž‘λ„: O(N)


Solution (DP)Permalink

# 맀번 1계단, 2계단 올라갈 수 있음
# μ •μƒκΉŒμ§€ 올라갈 수 μžˆλŠ” 방법은 λͺ‡ 가지인지 κ΅¬ν•˜μž!
class Solution:
    # DP 방식
    # μ‹œκ°„ λ³΅μž‘λ„: O(N)
    # Runtime: 31ms
    # Beats: 66.32%
    def climbStairs(self, n: int) -> int:
        # μ‹€μ œλ‘œ n을 1, 2, 3, 4, 5 μ­‰ 적고 ν•˜λ‚˜μ”© 경우의 수λ₯Ό μ„Έλ³΄μž
        # 1: 1, 2: 2, 3: 3(2 + 1), 4: 5(2 + 3), 5: 8(3 + 5)
        # 그럼 μœ„μ™€ 같이 λ¬΄μ–Έκ°€μ˜ κ·œμΉ™μ΄ 생김 -> 이λ₯Ό μ•„λž˜μ™€ 같이 dp의 "점화식"으둜 ν‘œν˜„ν•  수 있음
        # f(n) = f(n - 1) + f(n - 2)

        # 첫번째 κ³„λ‹¨μ˜ 경우의 μˆ˜μ™€ λ‘λ²ˆμ§Έ κ³„λ‹¨μ˜ 경우의 수λ₯Ό λ”•μ…”λ„ˆλ¦¬μ— μ €μž₯ (μ ν™”μ‹μœΌλ‘œ μ¨μ€˜μ•Ό ν•˜λ‹ˆ 2개)
        f = dict()
        f[1] = 1
        f[2] = 2

        # μ ν™”μ‹μ—μ„œ for문은 보톡 3λΆ€ν„° μ‹œμž‘ν•˜κ³  nκΉŒμ§€μ˜ 반볡문으둜 λ§Œλ“€μ–΄μ€Œ
        # 3번째 계단뢀터 μΆœλ°œν•˜κ³ , 점화식이 n - 2λΆ€ν„° nκΉŒμ§€λ‹ˆκΉŒ
        for i in range(3, n + 1):
            f[i] = f[i - 1] + f[i - 2]

        return f[n]

Solution (Memorization)Permalink

class Solution:
    # Memorization 방식 (dp처럼 λͺ¨λ“  κ³„λ‹¨μ˜ 수λ₯Ό λ‹€ ꡬ할 ν•„μš”κ°€ 사싀 μ—†μŒ)
    # κ·Έλ‹ˆκΉŒ dp λ°©μ‹μ—μ„œλŠ” for문으둜 μ „μ²΄μ˜ 계단을 λ‹€ 돈 λ‹€μŒμ— 결정을 ν•˜λ‹ˆκΉŒ
    # 이 λ°©μ‹μ—μ„œλŠ” 방법 μˆ˜κ°€ ꡬ해지면 κ·Έ μœ„μ— μžˆλŠ” 계단을 계산할 ν•„μš”κ°€ μ—†λŠ” κ±°μ§€
    # μ‹œκ°„ λ³΅μž‘λ„: O(N)
    # Runtime: 31ms
    # Beats: 66.32%
    def climbStairs(self, n: int) -> int:
        # n이 1κ³Ό 2일 λ•ŒλŠ” μ•„λž˜μ˜ n - 2 값이 μŒμˆ˜κ°€ λ˜λ―€λ‘œ μž…λ ₯ν•œ n이 κ·ΈλŒ€λ‘œ λ°˜ν™˜λ˜λ„λ‘ 처리
        if n < 3:
            return n

        # 이전과 ν˜„μž¬λ₯Ό 각각 첫번째, λ‘λ²ˆμ§Έ κ³„λ‹¨μ˜ 경우의 수둜 μ €μž₯
        before, current = 1, 2

        # μ„Έλ²ˆμ§Έ 계단뢀터 κ΅¬ν•˜λŠ” 둜직
        # Memorization을 μ§„ν–‰ν•˜μ—¬ ν˜„μž¬μ™€ 이전 λ³€μˆ˜λ§Œ 계속 μ €μž₯ν•˜μ—¬ λŒλ €μ£ΌλŠ” κ±°μ§€
        # κ·Έλž˜μ„œ n - 2λ²ˆμ§ΈκΉŒμ§€ λŒμ•„μ£ΌλŠ” κ±°κ³ 
        for _ in range(n - 2):
            # μ΄λ ‡κ²Œ ν•œλ²ˆμ— μž‘μ„±ν•˜μ§€ μ•ŠμœΌλ©΄ μ™„μ „ λ‹€λ₯Έ λ‘œμ§μž„
            # λ§Œμ•½ μ•„λž˜ 처럼 μž‘μ„±ν•œλ‹€λ©΄
            # before = current
            # current = before + current
            # before이 current λ³€μˆ˜λ‘œ μ €μž₯이 된 ν›„, current에 또 μ €μž₯을 ν•˜κ²Œ λ˜λŠ” κ±°λ‹ˆκΉŒ
            # μ™„μ „νžˆ 잘λͺ»λœ 둜직으둜 λ°”λ€œ
            before, current = current, before + current

        return current

Leave a comment