본문 바로가기
Algorithm/LeetCode

[Java] 70. Climbing Stairs

by tabasco 2023. 6. 9.

문제 설명 :
1칸 또는 2칸씩 계단을 오를 수 있는데, 계단 수가 주어지면 몇 번의 경우의 수로 계단을 오를 수 있는지 도출하는 문제
 
 
- 처음코드

class Solution {
    public int climbStairs(int n) {
        int result = 0;
        int quotient = n/2;

        for(int i=0; i<=quotient; i++){
            result += conbination(n-i, i);
        }

        return result;

    }

    private int conbination(int x, int quotient){
        if (quotient == 0) return 1; // factorial에서 0! 주의!

        return factorial(x)/(factorial(x-quotient)*factorial(quotient));
    }

    private int factorial(int x){
        int result = 1;

        for(int i=1; i<=x; i++){
            result = result*i;
        }

        return result;
    }
}

 
- 동적계획법을 적용한 코드

class Solution {
    public int climbStairs(int n) {
        if(n <= 2) return n;

        int[] step = new int[n+1];

        step[1] = 1;
        step[2] = 2;

        for(int i=3; i<=n; i++){
            step[i] = step[i-1] + step[i-2];
        }

        return step[n];

    }
}


해설 :
- 처음에는 경우의 수를 계산해서, 조합으로 처리하면 될 것 같아 factorial과 combination을 구현해 처리하였다.
- 초기 테스트 케이스는 통과하였는데, 다른 케이스들에서 문제가 생겨 알아보니 "동적계획법" 이라는 방식으로 해결해야하는 문제였다.
- 동적계획법으로 해결하는 문제가 처음이라 처음엔 다소 당황스러웠는데, 사실 상 수열과 확률을 해결할 때와 비슷했다.
- 예를들어 계단이 4개라고 하면, 우리는 처음에 1개의 계단을 오르고 3개의 계단을 갈 수 있고, 또는 2개의 계단을 오르고 나머지 2개의 계단을 갈 수 있다.
- 처음에 따라서 4개의 계단을 가는 것은 3개의 계단을 가는 방법과 2개의 계단을 가는 방법의 합으로 나타낼 수 있는데, 여기서 오랜만에 수학적 지식을 생각해보려고 하니 약간 띠용했다.
- 결국 처음에 1개를 갈지, 2개를 갈지는 경우의 수가 붙는게 아니라 내가 임의의 조건을 추가하는거라 카운트되지 않고 이런 조건에 따르는 결과에 대한 경우의 수를 합하면 되는 것이다.
- 따라서 step[n] = step[n-1] + step[n-2] 라는 점화식을 도출할 수 있다.

'Algorithm > LeetCode' 카테고리의 다른 글

[Java] 88. Merge Sorted Array  (0) 2023.06.12
[Java] 83. Remove Duplicates from Sorted List  (0) 2023.06.09
[Java] 69. Sqrt(x)  (0) 2023.06.09
[Java] 67. Add Binary  (0) 2023.06.08
[Java] 66. Plus One  (0) 2023.06.08