코딩테스트/알고리즘 문제풀이

[JAVA] 70. Climbing Stairs

지과쌤 2022. 9. 19.
반응형

목차

    문제

    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
    Output: 2
    Explanation: There are two ways to climb to the top.
    1. 1 step + 1 step
    2. 2 steps
    

    Example 2:

    Input: n = 3
    Output: 3
    Explanation: There are three ways to climb to the top.
    1. 1 step + 1 step + 1 step
    2. 1 step + 2 steps
    3. 2 steps + 1 step
    

     

    Constraints:

    • 1 <= n <= 45

    아이디어

    풀이

    class Solution {
        public int climbStairs(int n) {
            //전체 범위
            int[] result = new int[46];
    
            result[0] = 0;
            result[1] = 1;
            result[2] = 2;
    
            for(int i = 3; i<=n; i++){
                result[i] = result[i-1] + result[i-2];
            }
            
            return result[n];
        }
    }

    다른 풀이

    Recustion (Top Down Approach)

    /**
     * Question   : Climbing Stairs
     * Complexity : Time: O(2^n) ; Space: O(n)
     */
    class Solution {
        public int climbStairs(int n) {
            if (n == 0) {
                return 0;
            }
            if (n == 1) {
                return 1;
            }
            if (n == 2) {
                return 2;
            }
            return climbStairs(n - 1) + climbStairs(n - 2);
        }
    }

    Recustion + Memorization (Top Down Approach)

    /**
     * Question   : Climbing Stairs
     * Complexity : Time: O(n) ; Space: O(n)
     */
    class Solution {
        public int climbStairs(int n) {
            Map<Integer, Integer> memo = new HashMap<>();
            memo.put(1, 1);
            memo.put(2, 2);
            return climbStairs(n, memo);
        }
    
        private int climbStairs(int n, Map<Integer, Integer> memo) {
            if (memo.containsKey(n)) {
                return memo.get(n);
            }
            memo.put(n, climbStairs(n - 1, memo) + climbStairs(n - 2, memo));
            return memo.get(n);
        }
    }

    - 각각의 재귀 로직 내에서 동일한 주소값을 갖고있는 Map에 데이터를 저장

    - 시간복잡도 차이 확인 필요

    DP (Bottom Up Approach)

    /**
     * Question   : Climbing Stairs
     * Complexity : Time: O(n) ; Space: O(n)
     */
    class Solution {
        public int climbStairs(int n) {
            if (n <= 1) {
                return 1;
            }
            
            int[] dp = new int[n + 1];
            dp[1] = 1;
            dp[2] = 2;
    
            for (int i = 3; i <= n; i++) {
                dp[i] = dp[i - 1] + dp[i - 2];
            }
    
            return dp[n];
        }
    }

    - 내가 푼 방법

    - 기본 배열을 동적으로 구성하였음, 0번배열의 값은 초기화해줄 필요 X

    - 굳이 재귀를 사용할 필요가 있나 싶다...(재귀 너무 싫음)

    DP + Optimization (Bottom Up Approach)

    /**
     * Question   : Climbing Stairs
     * Complexity : Time: O(n) ; Space: O(1)
     */
    class Solution {
        public int climbStairs(int n) {
            if (n <= 1) {
                return 1;
            }
    
            int prev1 = 1;
            int prev2 = 2;
    
            for (int i = 3; i <= n; i++) {
                int newValue = prev1 + prev2;
                prev1 = prev2;
                prev2 = newValue;
            }
    
            return prev2;
        }
    }

    - 새 값을 계산하기 위해 앞의 두 값만 활용하므로 굳이 배열에 저장할 필요가 없음..!

    반응형

    '코딩테스트 > 알고리즘 문제풀이' 카테고리의 다른 글

    [JAVA][Codility] CyclicRotation  (0) 2022.09.30
    [JAVA] 338. Counting Bits  (0) 2022.09.21
    [JAVA] 69. Sqrt(x)  (0) 2022.09.16
    [JAVA] 83. Remove Duplicates from Sorted List  (0) 2022.09.14
    이후 문제 풀이 => LeetCode  (0) 2022.09.09

    댓글

    💲 추천 글