[LeetCode]Climbing Stairs

2023. 3. 21. 19:20·SW개발/코딩테스트

https://leetcode.com/problems/climbing-stairs/

 

Climbing Stairs - LeetCode

Can you solve this real interview question? Climbing Stairs - You are climbing a staircase. It takes n steps to reach the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?   Example 1: Input: n = 2 Outpu

leetcode.com

 

문제 분석

특정 수의 계단이 있을 때 1칸 혹은 2칸만 오를 수 있다고 가정하면, 계단을 오르는 총 방법은 몇가지가 되는지를 구하는 문제입니다.

 

처음 시도한 답안

class Solution:
    def climbStairs(self, n: int) -> int:
        # F(n) = F(n-1) + F(n-2)
        curr = prev = 1
        for _ in range(n-1):
            curr, prev = curr + prev, curr
        return curr

접근 방법

  1. N까지의 계단에 도달하기 위한 경우의 수를 구하기 위해서는 n-1 까지 오른 경우의 수와, n-2 까지 오른 경우의 수를 더합니다.
  2. curr, prev를 1로 초기화 하고, 반복문을 순회합니다.
  3. curr 값은 n-1을 가리키는 상태이고, prev 값은 n-2를 가리키는 상태입니다.
  4. curr와 prev를 더한 값을 curr로 할당하고, prev를 curr로 할당해 계단 올라간 것을 처리합니다.
  5. curr을 return 합니다.

 

두번째 시도한 답안

class Solution:
    def climbStairs(self, n: int) -> int:
        # F(n) = F(n-1) + F(n-2)
        dp = [1, 1, 2]

        if n <= 2:
            return dp[n]

        for i in range(3, n+1):
            dp.append(dp[i-1] + dp[i-2])
        
        return dp[n]

접근 방법

  1. 피보나치 수열의 초기값을 설정합니다.
  2. n이 2보다 작거나 같다면 그대로 return 합니다.
  3. 3부터 n까지 반복하여 피보나치 수를 누적합니다.
  4. 마지막에 담긴 값을 return 합니다.

첫번째 풀이방법과 동일하지만 동적 프로그래밍을 활용한 방법입니다.

 

예시와 설명

2개의 계단을 오르는 경우의 수

(0, 2) / (1, 1) -> 총 2가지

 

3개의 계단을 오르는 경우의 수

(1, 1, 1) / (1, 0, 2) / (0, 2, 1) -> 총 3가지

 

4개의 계단을 오르는 경우의 수

(1, 1, 1, 1) / (1, 1, 0, 2) / (1, 0, 2, 1) / (0, 2, 1, 1) / (0, 2, 0, 2) -> 총 5가지

 

5개의 계단을 오르는 경우의 수

(1, 1, 1, 1, 1) / (1, 1, 0, 2, 1) / (1, 0, 2, 1, 1) / (0, 2, 1, 1, 1) / (0, 2, 0, 2, 1) / (1, 1, 1, 0, 2) / (1, 1, 0, 1, 2) / (0, 2, 1, 0, 2) -> 총 8가지

 

각 계단을 오르는 경우의 수를 세어보다 보면 피보나치 수열과 같은 규칙을 발견할 수 있다. 즉 n개의 계단을 오르기 위한 경우의 수는 n-1, n-2 에서의 계단을 오르기 위한 경우의 수를 합한 것과 같다.

 

728x90

'SW개발 > 코딩테스트' 카테고리의 다른 글

[LeetCode]Symmetric Tree  (0) 2023.04.02
[LeetCode]Binary Tree Inorder Traversal  (0) 2023.03.22
[LeetCode]Merge Two Sorted Lists  (0) 2023.03.20
[LeetCode]Valid Parentheses  (0) 2023.03.19
[LeetCode]Longest Common Prefix  (0) 2023.03.19
'SW개발/코딩테스트' 카테고리의 다른 글
  • [LeetCode]Symmetric Tree
  • [LeetCode]Binary Tree Inorder Traversal
  • [LeetCode]Merge Two Sorted Lists
  • [LeetCode]Valid Parentheses
Leffe_pt
Leffe_pt
개발자로서 성장하면서 배워온 지식과 경험을 공유하는 공간입니다.
  • Leffe_pt
    Leffe's tistory
    Leffe_pt
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • SW개발 (303)
        • 코딩테스트 (172)
        • 개발이야기 (23)
        • IT 용어 (17)
        • Python (22)
        • Django (46)
        • Flask (2)
        • Database (1)
        • SQLAlchemy (0)
        • Javascript (5)
        • Linux, Unix (3)
        • JAVA (2)
        • Spring (10)
      • 회고 (4)
      • 사진 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    컨트리뷰터
    라이프 스타일
    배달비 공유
    Contributor
    오픈소스
    배달
    django
    배공파용
    음식
    트리 #AVL #알고리즘 #자료구조
    g
    어플리케이션
    플레이스토어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Leffe_pt
[LeetCode]Climbing Stairs
상단으로

티스토리툴바