[C++ / 11057] 오르막 수

2023. 7. 21. 01:48·알고리즘/백준
728x90

문제

 

11057번: 오르막 수

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

www.acmicpc.net


문제 설명

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

- 가능: 2234, 3678, 11119

- 불가능: 2232, 3676, 91111

수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하라.

0으로 시작가능.


풀이 방식

다음 이미지대로 하면 된다. 이게 DP의 방식 인지는 모르겠는데.. 이전의 값을 가지고 와서 현재의 값을 만들어 낸다.

다음 그림의 설명을 하기 위해 n=2일때를 예시로 들겠다.

n=2의 경우를 Brute Force 처럼 구해보면 다음과 같다.

  • 9 - 99
  • 8 - 88, 89
  • 7 - 77, 78, 79
  • 6 - 66, 67, 68, 69
  • 5 - 55, 56, 57, 58, 59
  • 4 - 44, 45, 46, 47, 48, 49
  • 3 - 33, 34, 35, 36, 37, 38, 39
  • 2 - 22, 23, 24, 25, 26, 27, 28, 29
  • 1 - 11, 12, 13, 14, 15, 16, 17, 18, 19
  • 0 - 00, 01, 02, 03, 04, 05, 06, 07, 08, 09

이렇게 총 55개가 존재한다. 이를 저 배열에 넣어 둔 것이다.

그렇게 n 자리수 마다 구하면 되는데 이를 점화식으로 만들어 보면 다음과 같다.

DP[i][j] = DP[i][j-1] + DP[i-1][j]

이를 이용하여 코딩하면 된다.


솔루션

#include <iostream>

using namespace std;

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

  int n;
  int save = 0, result = 0;

  int arr[1001][1001];

  cin >> n;

  if (n == 1)
  {
    cout << 10;
    return 0;
  }

  for (int i = 0; i < 10; i++)
    arr[0][i] = 1;

  for (int i = 0; i < n - 1; i++)
  {
    for (int j = 0; j < 10; j++)
    {
      arr[i + 1][j] = (save + arr[i][j]) % 10007;
      save = arr[i + 1][j];
    }
    save = 0;
  }

  for (int i = 0; i < 10; i++)
  {
    for (int j = 0; j <= i; j++)
    {
      result += arr[n - 2][j];
      result %= 10007;
    }
  }

  cout << result << endl;
  return 0;
}

여담

DP에 대해서 나름 요령이 생긴 것 같다! 이게 제대로 풀고 있는 건지는 잘 모르겠지만.. 아직 알고리즘을 구성하는데 있어서는 어색하다.

 

위에 짠 코드가 최적.. 은 아니다 문제가 있긴 하지만.. 또 이걸 최적화 할 시간에 다른 문제를 풀어보는게 알고리즘 풀이의 매력이 아닐까 싶기도 하다..ㅋㅋ

 

c++이 아직 익숙하지 않아서 그냥 배열로 충분한 것을 vector로 자꾸 구현하려고 하고 타입에러를 낼까봐 이것저것 찾아보고 있다..ㅎㅎ 화이팅~!!

 

저작자표시 (새창열림)

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

[C++ / 1629] 곱셈  (0) 2023.07.24
[C++ / 2075] N번째 큰 수  (0) 2023.07.23
[C++ / 1932] 정수 삼각형  (0) 2023.07.18
[C++ / 2563] 색종이  (0) 2023.07.16
[C++ / 11053] 가장 긴 증가하는 부분 수열  (0) 2023.07.15
'알고리즘/백준' 카테고리의 다른 글
  • [C++ / 1629] 곱셈
  • [C++ / 2075] N번째 큰 수
  • [C++ / 1932] 정수 삼각형
  • [C++ / 2563] 색종이
기짜낭
기짜낭
생각이 많지만, 지금 내가 해야할 것을 하자.
  • 기짜낭
    So tired
    기짜낭
    • 분류 전체보기 (199)
      • 개발 (11)
        • Javascript (19)
        • Typescript (5)
        • Canvas (8)
        • React (13)
        • C (3)
      • 활동 (63)
        • 개인 프로젝트 (33)
        • 나눔 서포터즈 3기 (9)
        • 멋쟁이 사자처럼 (7)
        • 0&1 C++ 자료구조 스터디 (0)
        • 제 9회 창업 아이디어톤 (3)
        • Poom (ZeroWasteShop) (3)
        • 해커톤 (2)
        • 우테코 프리코스 7기 (6)
      • 알고리즘 (27)
        • 알고리즘 정리 (5)
        • 백준 (18)
        • 프로그래머스 (4)
      • 강연 (7)
      • 독서 (18)
      • 회고 & 생각 (16)
        • 연간회고 (4)
      • 기타 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • ※ 예전 블로그
  • 인기 글

  • 태그

    Erica
    TypeScript
    타입스크립트
    HTML
    프로젝트
    프로그래밍
    한양대학교
    Javascript
    canvas
    react
    3기
    ES6
    에리카
    백준
    군대
    알고리즘
    개발
    우테코
    프론트엔드
    대학
    개발자
    개념
    독후감
    1주에 1권씩
    CSS
    tutorial
    1주 1권
    HTML5
    독서
    디자인
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
기짜낭
[C++ / 11057] 오르막 수
상단으로

티스토리툴바