📜 코딩테스트/BAEKJOON\다이나믹 프로그래밍

백준 10844번 (DP) - 쉬운 계단 수 (JAVA) 문제 풀이

2021. 8. 19. 01:12
목차
  1.  
  2. 1. 테이블 정의
  3.  
  4. 2. 점화식 세우기
  5.  
  6. 3. 초기값 설정
반응형

10844번: 쉬운 계단 수 (acmicpc.net)

 

10844번: 쉬운 계단 수

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

www.acmicpc.net


 

✏️ 문제


 

🔐 문제 해결

 

1. 테이블 정의

dp[i][j]는 길이가 i이고, j로 시작하는 수들 중 계단 수의 개수를 뜻합니다.

설명이 부족한 듯 해보여 아래의 표 형태로 표현해보았습니다.

  • 0으로 시작하는 수는 없다고 조건에 나와있지만, 점화식을 세우기 위해서는 0으로 시작하는 계단 수도 필요합니다.
  • dp[i][j]에는 위 표에서 정의한 대로 개수가 들어갈 것입니다. 여기서 중요한 포인트는 dp[1][0] = 0이라고 해서 개수가 0이 아닙니다! 1개로 체크해줘야 아래 점화식이 성립합니다.

 

2. 점화식 세우기

위 표를 참고하면서 점화식을 세우면 아래와 같습니다. (단, i는 2부터 시작합니다.)

  • 길이가 i일 때, 0으로 시작하는 수는 dp[i][0]은 dp[i-1][1] 값과 동일합니다. (dp[i][j]는 개수입니다.)
  • 길이가 i이고 j로 시작하는 수 일때, dp[i][j]는 dp[i-1][j-1] + dp[i-1][j+1]과 동일합니다.
  • 단, 길이가 i이고 9로 시작하는 수는 dp[i-1][8]과 동일합니다. 

위 조건을 코드로 나타내면 아래와 같습니다.

for(int i = 2; i <= N; i++) {
    // 0으로 시작하는 계단 수의 개수는 길이가 i-1이고 1로 시작하는 계단 수의 개수와 동일합니다.
        dp[i][0] = dp[i-1][1];

        // j(1 ~ 8)로 시작하는 계단 수는 i-1길이의 j-1로 시작하는 계단 수와 j+1로 시작하는 계단수의 개수의 합과 동일합니다.
        for(int j=1; j<=8; j++) {
            dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1];
        }

        // 9로 시작하는 계단 수는 i-1길이의 8로 시작하는 계단 수의 개수와 같습니다.
        dp[i][9] = dp[i-1][8];
}

 

3. 초기값 설정

초기값으로는 길이가 1일 때의 계단 수의 개수만 설정해주면 됩니다.

주의해야 할 점은, int형 범위를 넘을 수 있기 때문에 long 배열을 사용합니다.

for(int i=0; i<=9; i++) {
    dp[1][i] = 1L;
}

 

🗝 전체 코드

import java.io.*;
import java.util.*;

public class Main {
    static int N;
    static final long MOD = 1_000_000_000L;
    public static void main(String args[]) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(bf.readLine());

        long[][] dp = new long[N+1][10];

        // init
        for(int i=0; i<=9; i++) {
            dp[1][i] = 1L;
        }

        for(int i=2; i<=N; i++) {
            // 0으로 시작하는 수의 개수
            dp[i][0] = dp[i-1][1];
            for(int j=1; j<=9; j++) {
                // 9일경우는 이전 자릿수의 8로 시작하는 수의 개수와 동일하다!
                if(j == 9) dp[i][9] = dp[i-1][8] % MOD;
                // 나머지 수들은 이전 숫자의 j-1로 시작하는 수의 개수와 j+1로 시작하는 수의 개수를 더한 값이다.
                else dp[i][j] = (dp[i-1][j-1] % MOD + dp[i-1][j+1] % MOD) % MOD;
            }
        }

        long result = 0;
        for(int i=1; i<=9; i++) {
            result = (result + dp[N][i]) % MOD;    // 정답을 더하면서 오버플로우가 발생할 수 있으므로 주의!
        }
        System.out.print(result);
    }
}

감사합니다!

반응형
저작자표시 (새창열림)
  1.  
  2. 1. 테이블 정의
  3.  
  4. 2. 점화식 세우기
  5.  
  6. 3. 초기값 설정
'📜 코딩테스트/BAEKJOON\다이나믹 프로그래밍' 카테고리의 다른 글
  • 백준 9465번 (DP) - 스티커 (JAVA) 문제 풀이
  • 백준 15486번 (DP) - 퇴사 2 (JAVA) 문제 풀이
  • 백준 11053번 (DP) - 가장 긴 증가하는 부분 수열 (JAVA) 문제 풀이
  • 백준 2156번 (DP) : 포도주 시식 (JAVA) 문제 풀이
iseunghan
iseunghan
꾸준하게 열심히..
iseunghan
iseunghan

공지사항

  • 어제보다 나은 오늘이 되기 위해 🔥
  • 분류 전체보기 (262)
    • 💐 Spring (14)
      • 개념 및 이해 (2)
      • Spring 핵심 기술 (24)
      • Spring REST API (8)
      • Spring MVC, DB 접근 기술 (7)
      • Spring Security (23)
      • Spring in Action (1)
    • 🌻 JAVA (84)
      • 자바 ORM 표준 JPA 프로그래밍 (20)
      • 알고리즘, 자료구조 (13)
      • 디자인 패턴 (7)
      • 정리정리정리 (43)
      • JUnit (1)
    • 🔖 Snippets (3)
      • Javascript (3)
    • ⚙️ Devops (22)
      • ⛏ Git (11)
      • 🐳 Docker (6)
      • 🐧 Linux (3)
      • 🌈 Jenkins (1)
      • 📬 Kafka (1)
    • 💬 ETC.. (4)
      • 💻 macOS (2)
    • 🌧️ ORM (2)
      • JPA (2)
    • 🐍 Python (3)
    • 📚 Databases (15)
      • 오라클로 배우는 데이터베이스 개론과 실습(2판) (3)
      • RealMySQL 8.0 (8)
    • 🔥 Computer Science (5)
      • 📡 네트워크 (5)
    • 🏷️ 협업 (1)
    • 📜 코딩테스트 (38)
      • BAEKJOON\수학 1, 수학 2 (8)
      • BAEKJOON\재귀 (5)
      • BAEKJOON\브루트 포스 (3)
      • BAEKJOON\정렬 (1)
      • BAEKJOON\백트래킹 (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\이분탐색 (1)
      • BAEKJOON\다이나믹 프로그래밍 (9)
      • BAEKJOON\그리디 알고리즘 (0)
    • ✨ ISEUNGHAN (1)

인기 글

전체
오늘
어제
반응형
hELLO · Designed By 정상우.
iseunghan
백준 10844번 (DP) - 쉬운 계단 수 (JAVA) 문제 풀이
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.