몽환화

[백준] 11057 오르막 수 : 자바스크립트(node.js) 본문

알고리즘

[백준] 11057 오르막 수 : 자바스크립트(node.js)

hyeii 2024. 3. 19. 16:10

문제

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

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

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

 

입력

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

 

출력

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

 

풀이 방법

다이나믹 프로그래밍.... 공부를 해도 해도 어려운 dp....

규칙을 찾으면 간단하게 풀리는 문제

 

dp[i][j] : 길이가 i면서 j로 끝나는 오르막 수의 개수

=> 길이가 1이면서 0으로 끝나는 오르막 수 : 0 1개

=> 길이가 1이면서 1로 끝나는 오르막 수 : 1 1개

..

=> 길이가 1이면서 9로 끝나는 오르막 수 : 9 1개

 

=> 길이가 2이면서 0으로 끝나는 오르막 수 : 00 1개

=> 길이가 2이면서 1으로 끝나는 오르막 수 : 01 11 2개

=> 길이가 2이면서 2으로 끝나는 오르막 수 : 02 12 22 3개

...

암튼 이런 식인거

  0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1 1
2 1 2 3 4 5 6 7 8 9 10
3 1 3 6 10 15 21 28 36 45 55
4 1 4 10 20 35 56 84 120 165 220

 

그럼 결국 dp[i][j] = dp[i -1][j] + dp[i][j-1]라는 공식이 성립함

그냥 노가다로 돌려버리

 

처음 풀이

const input = require("fs")
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt")
  .toString()
  .trim();

const solution = () => {
  const N = parseInt(input);
  let dp = new Array(N + 1);
  for (var i = 0; i <= N; i++) {
    dp[i] = new Array(10);
  }

  for (var i = 0; i < 10; i++) {
    dp[1][i] = 1;
  }

  for (var i = 0; i <= N; i++) {
    dp[i][0] = 1;
  }

  for (var i = 2; i <= N; i++) {
    for (var j = 1; j < 10; j++) {
      dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % 10007;
    }
  }
  let answer = 0;
  for (var i = 0; i < 10; i++) {
    answer += dp[N][i];
  }
  console.log((answer %= 10007));
};

solution();

 

생각해보니까 그냥 배열을 처음 만들때 다 1을 때려넣고 시작하면 되는거잖.....

그리고 굳이 마지막에 for문 한번 더 돌려서 값 더하지 말고 그냥 바로 reduce를 써버리자

소요시간은 차이 없겠지만 그래도 코드가 깔끔해지니깐 웅...

 

 

코드 정리 후 두번째 풀이

const input = require("fs")
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt")
  .toString()
  .trim();

const solution = () => {
  const N = parseInt(input);
  let dp = Array.from(Array(N + 1), () => new Array(10).fill(1));

  for (var i = 2; i <= N; i++) {
    for (var j = 1; j < 10; j++) {
      dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % 10007;
    }
  }
  console.log(dp[N].reduce((a, v) => a + v) % 10007);
};

solution();

 

 

자바스크립트 공부가 필요하다,,,