문제 url: https://leetcode.com/problems/climbing-stairs/description/
설명: 계단을 오르는데, 가장 맨 위 계단까지 n번의 경우의 수가 걸린다.
매번 1계단 또는 2계단을 오를 수 있다. n개의 계단이 주어질 때,
n개의 계단을 오르는 경우의 수를 구하는 로직을 작성하기
이 알고리즘을 작성하면서 알게된 개념
- 피보나치 수열: 앞의 두 수를 더한 값이 그 다음 나열되는 수라는 규칙을 갖는다.
그 다음 나열되는 수를 n이라고 했을 때, n의 값은 (n-2)+(n-1) 를 합한 값.
배열이 기준이 된다면 n-2, n-1는 배열의 인덱스 참조,
변수가 기준이 된다면 변수에 담긴 값을 참조한다고 생각하면 될 듯?
- dp(Dynamic Programming, 동적 계획법): 문제를 분할하고(문제를 작은 부분으로 나누고),
그 결과를 재활용하여(작은 문제의 결과 값을 저장하고, 같은 계산을 반복하지 않도록 함)
전체 문제를 해결하는 방법을 의미한다.
- Bottom-Up 방식(dp를 구현하는 방식중 하나): 반복문과 배열(또는 변수들)을 활용하여
작은 문제부터 차례차례 해결해 나가는 방법을 의미한다.
실습
매번 계단을 1계단 또는 2계단을 올라갈 수 있을 때,
n개의 계단을 오를 수 있는 경우의 수를 구하는 기능을 갖는 클래스를 작성하기
클래스명 작명: 계단을 오르는 방법(경우의 수)의 갯수를 구하는 기능을 가진 클래스여서
'구한다', '계단 오르기', '방법의 수'에 핵심을 두었고, 구한다가 계산을 하는 의미로 판단하여
calculator, counter 가 클래스명에 들어가도 무방하다고 판단,
StairClimbCounter로 작명했다.
public class StairClimbCounter {
// int stairs 계단의 갯수를 파라미터로 받고,
// 해당 계단의 갯수를 오르는 경우의 수를 반환하는 메서드명 countWays 라 명명
public int countWays(int stairs) {
if(stairs<=0) return -1; // 계단의 갯수가 0이하에 해당하면(0또는 음수) -1을 반환한다.
if(stairs<=2) return stairs; // 계단의 갯수인 n이 2이하에 해당하면 해당 n을 반환한다.
int twoStepBefore=1;
int oneStepBefore=2;
int ways=0;
// 위 조건으로 인해 계단의 시작 갯수는 3부터 시작
// dp를 구현하는 방식중 bottom-up 방식을 사용,
// 반복문과 변수들을 사용하여 피보나치 수열을 표현
for(int current=3; current <= stairs; current++) {
ways=oneStepBefore+twoStepBefore;
twoStepBefore=oneStepBefore;
oneStepBefore=ways;
}
return ways;
}
}'알고리즘' 카테고리의 다른 글
| 버블정렬(bubble sort) 구현하기 (0) | 2025.09.17 |
|---|---|
| Stack과 Queue (7) | 2025.08.06 |
| (백준) 문자열 다루기 (4) | 2025.08.04 |
| 이상한 문자 만들기 (2) | 2025.07.01 |
| 3진법 뒤집기 (2) | 2025.06.27 |