길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm/Dynamic Programming

[백준 10844번] 쉬운 계단 수 (C++)

2022. 5. 4. 18:28

https://www.acmicpc.net/problem/10844

 

10844번: 쉬운 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net


쉬운 계단 수 문제는 다이나믹 프로그래밍을 이용하여 해결할 수 있습니다.

0으로 끝나는 N 단계의 계단 수는 1로 끝나는 N - 1 단계의 계단 수와 같습니다.

마찬가지로, 9로 끝나는 N 단계의 계단 수는 8로 끝나는 N - 1 단계의 계단 수와 같습니다.

 

또한, i(1 ~ 8)로 끝나는 N 단계의 계단 수는 pre[i - 1] + pre [i + 1]입니다. (단, pre[j]는 j로 끝나는 N - 1 단계의 계단 수)

d[i] = nxt[0] + nxt[1] + nxt[2] + nxt[3] + ... +  nxt[9] 
// 단, d[i]는 길이가 i인 계단 수의 개수
// nxt[j]는 j로 끝나는 N 단계의 계단 수의 개수

 

이를 이용하여 쉬운 계단 수 문제를 해결할 수 있습니다.

단, 1,000,000,000로 나눈 나머지를 출력해야 하므로, j로 끝나는 N 단계의 계단 수도 1,000,000,000로 나눈 나머지를 취해야합니다.

 

전체 코드는 아래와 같습니다. 

#include <bits/stdc++.h>
using namespace std;

#define MOD 1000000000
int d[101];
int pre[10], nxt[10];   // pre[j]는 j로 끝나는 N - 1 단계의 계단 수의 개수
                        // nxt[j]는 j로 끝나는 N 단계의 계단 수의 개수

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n; cin >> n;
    d[1] = 9;   // 초기값
    for(int i = 1; i < 10; i++) pre[i] = 1; // 초기값

    // Bottom-Up 방식의 다이나믹 프로그래밍
    for(int i = 2; i <= n; i++){      
        for(int j = 0; j <= 9; j++){
            if(j == 0) nxt[j] = pre[j + 1]; // 0으로 끝나는 N 단계의 계단 수는 1로 끝나는 N - 1 단계의 계단 
            else if(j == 9) nxt[j] = pre[j - 1];    // 9로 끝나는 N 단계의 계단 수는 8로 끝나는 N - 1 단계의 계단 수
            // pre[j - 1], pre[j + 1] 모두 1000000000 보다 작기 때문에 % MOD 해주지 않아도 됨
            else nxt[j] = (pre[j - 1] + pre[j + 1]) % MOD; // i(1 ~ 8)로 끝나는 N 단계의 계단 수는 pre[i - 1] + pre [i + 1]
            
            d[i] = (d[i] + nxt[j]) % MOD;
        }
        
        memcpy(pre, nxt, sizeof(nxt));  // nxt는 pre가 됨
    }

    cout << d[n]<< "\n";
}

'Algorithm > Dynamic Programming' 카테고리의 다른 글

[백준 2156번] 포도주 시식 (C++)  (0) 2022.05.05
[백준 15486번] 퇴사 2 (C++)  (0) 2022.05.05
[백준 11055번] 가장 큰 증가 부분 수열 (C++)  (0) 2022.04.15
[백준 1912번] 연속합 (C++)  (0) 2022.04.15
[백준 2193번] 이친수 (C++)  (0) 2022.04.14
    'Algorithm/Dynamic Programming' 카테고리의 다른 글
    • [백준 2156번] 포도주 시식 (C++)
    • [백준 15486번] 퇴사 2 (C++)
    • [백준 11055번] 가장 큰 증가 부분 수열 (C++)
    • [백준 1912번] 연속합 (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바