장 준
씨포유
장 준
전체 방문자
오늘
어제
  • 분류 전체보기 (91)
    • 프로그래밍언어 (15)
      • c언어 (10)
      • 파이썬 (0)
      • 자바스크립트 (5)
    • PS (58)
      • 알고리즘 이론 (18)
      • 프로그래머스 (5)
      • 백준 (35)
    • CS (16)
      • 자료구조 (5)
      • 운영체제 (3)
      • 네트워크 (5)
      • 데이터베이스 (0)
      • 기초 지식 (3)
    • 브랜드 (1)

블로그 메뉴

  • 태그

인기 글

태그

  • CS
  • Visual Studio
  • 자료구조
  • PS
  • nodejs
  • recursion
  • C
  • JavaScript
  • 알고리즘
  • 코딩테스트
  • DFS
  • python3
  • DP
  • 자바스크립트
  • 파이썬
  • 백준
  • BFS
  • 씨포유
  • 기초 지식
  • Network
  • Implementation
  • 프로그래머스
  • JS
  • Kruskal algorithm
  • 프로그래밍언어
  • pypy3
  • codesandbox
  • Stack
  • Priority Queue
  • bitmask

최근 댓글

최근 글

hELLO · Designed By 정상우.
장 준

씨포유

[백준(BOJ)] #10844- 쉬운 계단 수 (파이썬, PyPy3)
PS/백준

[백준(BOJ)] #10844- 쉬운 계단 수 (파이썬, PyPy3)

2022. 11. 7. 11:40
728x90

문제

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

 

10844번: 쉬운 계단 수

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

www.acmicpc.net

 


문제 풀이

동적 계획법을 사용해 입력받은 자리 수의 계단수에 대한 경우의 수를 구할 수 있습니다.

2022.07.22 - [PS/알고리즘 이론] - [파이썬으로 배우는 알고리즘] 동적 계획법(Dynamic Programming)

 

[파이썬으로 배우는 알고리즘] 동적 계획법(Dynamic Programming)

동적 계획법(Dynamic Programming)이란? 동적 계획법(Dynamic Programming), 다이나믹 프로그래밍, DP라고 불리는 이 알고리즘은 무엇일까요?? 동적 프로그래밍? 저는 이 말을 처음 접했을 때 의미에 대해 생

c4u-rdav.tistory.com

 

2차원 dp테이블을 다음과 같이 정의합니다.

dp[N 자리 수][N 자리 수에서 맨 뒷자리에 오는 수]

1) 1의 자리 수에서 맨 뒷자리에 올 수 있는 숫자들을 초기화합니다. 이때 0이 맨 앞에 있는 경우에는 계단 수가 될 수 없으므로 0이 됩니다.

 

2) 자리 수가 2일 때 각 숫자에서 맨 뒷자리에 올 수 있는 숫자의 경우의 수를 저장합니다.

 

크기가 2면서 맨 뒷자리 숫자가 0인 경우는 크기가 1이면서 맨 뒷자리 숫자가 1인 경우만 해당됩니다. 즉, 크기가 1이면서 맨 뒷자리 숫자가 1인 계단 수에서 크기가 증가될 때 얻을 수 있는 계단 수의 경우의 수입니다.

 

크기가 2면서 맨 뒷자리 숫자가 1부터 8인 경우는 크기가 1이면서 맨 뒷자리 숫자가 해당 숫자에서 1을 더하고 뺀 경우가 해당됩니다. 즉, 크기가 1이면서 맨 뒷자리 숫자가 해당 숫자에서 1을 더하고 뺀 계단 수에서 크기가 증가될 때 얻을 수 있는 계단 수의 경우의 수입니다.

 

크기가 2면서 맨 뒷자리 숫자가 9인 경우는 크기가 1이면서 맨 뒷자리 숫자가 8인 경우만 해당됩니다. 즉, 크기가 1이면서 맨 뒷자리 숫자가 8인 계단 수에서 크기가 증가될 때 얻을 수 있는 계단 수의 경우의 수입니다.

 

이런 과정을 통해 다음과 같은 점화식을 얻을 수 있습니다.

i = 자리 수, j = 맨 뒷자리에 오는 수

j = 0 일 때, dp[i][j] = dp[i-1][1]
1 <= j <= 8 일 때, dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]
j = 9 일 때, dp[i][j] = dp[i-1][8]

 


구현

코드

import sys
input = sys.stdin.readline

if __name__ == "__main__":
    N = int(input())
    dp = [[0] * 10 for _ in range(N+1)]
    # 1 ~ 9까지. 0은 맨 앞에 올 수 없음
    for i in range(1, 10):
        dp[1][i] = 1

    # dp[자리 수][해당 자리 수에서 맨 뒷자리 숫자]
    # 자리수 i
    for i in range(2, N+1):
        # 숫자 범위 j
        for j in range(10):
            # i에서 맨 뒷자리 숫자가 0이면 
            # i-1에서맨 뒷자리 숫자가 1인 경우만 계단 수로 이어갈 수 있음
            if j == 0:
                dp[i][j] = dp[i-1][1]
            # i에서 맨 뒷자리 숫자가 9이면 
            # i-1에서맨 뒷자리 숫자가 8인 경우만 계단 수로 이어갈 수 있음
            elif j == 9:
                dp[i][j] = dp[i-1][8]
            # 그 외에는 맨 뒷자리 숫자 +-1
            else:
                dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1]
    print(sum(dp[N]) % 1000000000)

결과

728x90
반응형
저작자표시 (새창열림)

'PS > 백준' 카테고리의 다른 글

[백준(BOJ)] #1561- 놀이 공원 (파이썬, PyPy3)  (0) 2022.11.09
[백준(BOJ)] #1562- 계단 수 (파이썬, PyPy3)  (0) 2022.11.08
[백준(BOJ)] #1525- 퍼즐 (파이썬, PyPy3)  (0) 2022.11.03
[백준(BOJ)] #1103- 게임 (파이썬, PyPy3)  (0) 2022.11.02
[백준(BOJ)] #1194- 달이 차오른다, 가자. (파이썬, PyPy3)  (2) 2022.10.30
    'PS/백준' 카테고리의 다른 글
    • [백준(BOJ)] #1561- 놀이 공원 (파이썬, PyPy3)
    • [백준(BOJ)] #1562- 계단 수 (파이썬, PyPy3)
    • [백준(BOJ)] #1525- 퍼즐 (파이썬, PyPy3)
    • [백준(BOJ)] #1103- 게임 (파이썬, PyPy3)
    장 준
    장 준
    C4U(Computer For You)

    티스토리툴바