πŸ’» Computer Science/- Data Structure, Algorithm

[μ•Œκ³ λ¦¬μ¦˜ PS] λ°±μ€€ 10844 μ‰¬μš΄ 계단 수 μžλ°” 문제 풀이

Wonit 2021. 1. 27. 23:34

문제

ν•΄λ‹Ή ν¬μŠ€νŒ…μ€ λ°±μ€€μ˜ 10844번 μ‰¬μš΄ 계단 수 의 μ ‘κ·Όκ³Ό ν•΄κ²° 방법을 μ„€λͺ…ν•œ κΈ€ μž…λ‹ˆλ‹€.
μ •λ‹΅ μ†ŒμŠ€ μ½”λ“œλ₯Ό ν™•μΈν•˜μ‹œλ €λ©΄ solve url μ—μ„œ 확인 κ°€λŠ₯ν•©λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό λ¨Όμ € μƒκ°ν•΄λ³΄μž.

해결법

μš°μ„  이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” μžλ¦¬μˆ˜μ— λŒ€ν•œ κ°œλ…μ„ λ¨Όμ € μ•Œμ•„μ•Ό ν•œλ‹€.

 

45765 μ΄λΌλŠ” μˆ˜κ°€ μžˆλ‹€λ©΄ ν•΄λ‹Ή μˆ˜λŠ” κ°€μž₯ μ™Όμͺ½μ˜ μˆ˜κ°€ 제일 높은 자리 μˆ˜κ°€ λœλ‹€.


즉

  4     5     7     6    5
5자리  4자리  3자리  2자리  1자리

그럼 μš°λ¦¬λŠ” 이 문제λ₯Ό n번쨰 μžλ¦¬μ™€ n-1 번째 자리둜 점화식을 λ§Œλ“€ 수 μžˆλ‹€.

 

ν˜„μž¬ n번째 μžλ¦¬μ—μ„œ 쓰일 수 μžˆλŠ” n-1 번쨰 자리의 μˆ«μžλ“€μ˜ μ“°μž„ 횟수λ₯Ό λ”ν•˜λ©΄ μ΅œμ’… 점화식이 λ‚˜μ˜€κ²Œ λœλ‹€.

a[n] = [n-1]

접근법

μœ„μ˜ 점화식을 κ΅¬μ„±ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ μˆ˜κ°€ n번째 μžλ¦¬μ—μ„œ λ‚˜μ˜¬ 수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄μž.

 

n번쨰 자리의 μˆ˜κ°€ 예λ₯Ό λ“€μ–΄ 3이라고 ν•˜λ©΄ n-1번째 μžλ¦¬μ—μ„œ μ‚¬μš©λ  수 μžˆλŠ” νšŸμˆ˜λŠ” 총 2νšŒμ΄λ‹€.


23, 32.


그럼 λͺ¨λ“  n번쨰 자리의 수 (0~9κΉŒμ§€)λŠ” μœ„μ™€ 같이 2번 μ“°μΌκΉŒ?

 

λ‹€μŒ 경우λ₯Ό 봐보자.

 

  1. 0으둜 μ‹œμž‘ν•˜λŠ” μˆ˜λŠ” μ—†μœΌλ‚˜ 0으둜 λλ‚˜λŠ” 계단 μˆ˜λŠ” μ‘΄μž¬ν•¨. 즉 10 μ—μ„œλ§Œ 쓰일 수 있음
  2. 9λŠ” n-1번째 수의 8μ—μ„œλ§Œ 쓰일 수 있음.

거기에 μš°λ¦¬κ°€ 찾은 쑰건 n번째 자리 수 m은 n-1λ²ˆμ§Έμ—μ„œ 2λ²ˆμ”© μ‚¬μš©λ¨μ„ μΆ”κ°€ν•˜λ©΄ λ‹€μŒκ³Ό 같은 점화식이 λ„μΆœλœλ‹€.

// n: n번쨰 자리수
// m: n자리 μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” 수 0 ~ 9

// m이 0인 경우
a[n][m] = a[n-1][1];
// m이 1 ~ 8 사이인 경우
a[n][m] = a[n-1][m+1] + a[n-1][m-1];

// m이 9인 경우
a[n][m] = a[n-1][9];

μ˜€λ‹΅ 후보

그리고 μ£Όμ˜ν•΄μ•Όν•  것이 μ΄λ²ˆμ—λ„ μ—­μ‹œ mod 연산이 μ•„λ‹κΉŒ μ‹Άλ‹€.

 

μ΄λ²ˆμ—λŠ” κΈ°μ‘΄ λͺ¨λ“ˆλŸ¬μ™€ 쑰금 λ‹€λ₯Ό 수 μžˆλ‹€.

 

10μ–΅μœΌλ‘œ λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•˜λΌλΌλŠ” μ΄μœ κ°€ μš°λ¦¬κ°€ μ–΄λ–€ 수λ₯Ό λ„˜μ–΄κ°€λ©΄ 결과둜 10얡이 λ„˜κ²Œ λ‚˜μ™€μ„œ μ •μˆ˜ μ˜€λ²„ν”Œλ‘œκ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.


그럼 ν•˜λ‚˜μ˜ μ›μ†Œ 값은 (arr[n][m]) μ΅œλŒ€ 10얡이 될 수 있고 (arr[n])의 ν¬κΈ°λŠ” μ΅œλŒ€ 100μ–΅ - arr[n][0]이 될 수 μžˆλ‹€.


κ·Έλž˜μ„œ 값을 μ €μž₯ν•  λ•Œμ—λ„ λͺ¨λ“ˆλŸ¬λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.


μ—¬κΈ°μ„œ 끝일까?


값을 μ €μž₯ν•  λ•Œλ„ λͺ¨λ“ˆλŸ¬λ‘œ λ„£μ–΄μ€¬μœΌλ©΄ μ΅œμ•…μ˜ 경우 좜λ ₯ν•  λ•Œλ„ 100μ–΅ 언저리가 될 수 μžˆμœΌλ―€λ‘œ 좜λ ₯을 ν•  λ•Œλ„ λͺ¨λ“ˆλŸ¬λ₯Ό μˆ˜ν–‰ν•΄μ£Όμž.


이것 λ•Œλ¬Έμ— 많이 ν‹€λ Έλ‹€..

μ •λ‹΅ μ½”λ“œ

import java.io.*;
public class Main{
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int n = Integer.parseInt(br.readLine());

    int[][] arr = new int[101][10];
    for(int i = 1; i <= 9; i++) arr[1][i] = 1;

    for(int i = 2; i <= n; i++){
      arr[i][0] = arr[i-1][1];
      arr[i][9] = arr[i-1][8];
      for(int j = 1; j <= 8; j++) {
        arr[i][j] = (arr[i-1][j+1] + arr[i-1][j-1]) % 1000000000;
      }
    }
    int answer = 0;

    for(int i = 0; i <= 9; i++) {
      answer = (answer + arr[n][i]) % 1000000000;
    }

    bw.write(String.valueOf(answer));
    bw.flush();
    bw.close();
  }
}

μ •λ‹΅ μ†ŒμŠ€ μ½”λ“œλ₯Ό ν™•μΈν•˜μ‹œλ €λ©΄ solve url μ—μ„œ 확인 κ°€λŠ₯ν•©λ‹ˆλ‹€.