티스토리 뷰

반응형

www.acmicpc.net/problem/11057

 

11057번: 오르막 수

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수

www.acmicpc.net

>문제 설명

더보기

문제

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다.

예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.

수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.

입력

첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다.

출력

첫째 줄에 길이가 N인 오르막 수의 개수를 10,007로 나눈 나머지를 출력한다.

 

풀이

 DP 문제이고, 점화식을 우선 세워주었다.

 

 m자리수를 계산했을 때, 맨 뒷자리가 0~9가 되는 갯수를 dp[]에 저장해준다.  

 맨 뒷자리 숫자를 기준으로 봤을 때, 다음 자리 수는 자신과 자신보다 큰 수의 갯수만큼 늘어난다.

  • *..*0 => 0~9, 10개 (문제 조건에 0으로 시작하는 수 있다함)
  • *..*1 => 1~9, 9개
  • *..*2 => 2~9, 8개
  • ....
  • *..*9 => 9, 1개

 위처럼 반복문을 돌면서 dp 계산을 해주려면 반복문이 3개 중첩돼야할 것 같았다.(구현해보진 않음 생각만 함)

  • 제일 밖 - 자리 수
  • 중간 - 맨 뒷자리 수
  • 제일 안 - 중간 반복문 기준으로 dp배열 돌며 갱신 → if,  중간이 1이면 dp[1]~dp[9] 까지 돌며 +1

 반복 횟수가 크지는 않아서 (안쪽 2개는 10번) 저렇게 풀어도 될 것 같았지만, 더 좋은 아이디어가 있을 것 같았다!

 그래서 생각해낸 게 아래와 같은 방법!

  1. 위 방법과 똑같이 각 자리 수마다 맨 뒷자리 숫자를 기준으로 판단
  2. 맨 뒷자리 숫자가 0일 때, dp[i][0] = 1 (맨 뒷자리가 0일 경우는 1개 000..0)
  3. 맨 뒷자리 숫자가 1일 때, dp[i][1] = dp[i-1][1] + dp[i][0] (맨 뒷자리가 1일 경우는 0...01, ***..11)
  4. 이런 식으로 생각해보면 dp[i][j] = dp[i-1][j] + dp[i][j-1] 이렇게 점화식이 나온다!

 구현한 코드는 아래 참고! 

 문제 조건에 10007로 나눈 나머지를 구하라하니 꼭 잊지 말고 해주기!!

#define MOD 10007
#include <iostream>
#include <vector>
using namespace std;

int n;

long long solve(){
    
    int dp[1002][10] = {0, };
    
    //initialize
    for(int i=0; i<10; i++){
        dp[0][i] = 1;
    }
    
    for(int i=1; i<n; i++){
        for(int j=0; j<10; j++){
            if(j==0) dp[i][j] = dp[i-1][j];
            else dp[i][j] = (dp[i-1][j] + dp[i][j-1]) % MOD;
        }
    }
    
    //Add all counts 0~9
    long long result = 0;
    for(int i=0; i<10; i++){
        result = (result + dp[n-1][i]) % MOD;
    }
    
    return result;
}

int main()
{
    cin>>n;
    
    cout<<solve()<<"\n";
    
    return 0;
}

 

두 번째 점화식을 생각해내는데 오래 안걸렸다! 속도가 좀 빨라졌다 싶어서 뿌듯😊

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함