jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바스크립트 모듈 시스템
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 백준 17406 nodeJS
  • 계수정렬 자바스크립트
  • javascript use strict
  • 가사 검색 자바스크립트
  • 자바스크립트 채팅방 스크롤
  • 리코쳇 로봇 javascript
  • 덧칠하기 javascript
  • 백준 자바스크립트 입력 템플릿
  • safari Date format NaN
  • fetch 취소하기
  • 리액트 프로젝트 디버깅하기
  • 병합정렬 자바스크립트
  • safari invalid date error
  • JavaScript
  • 자바스크립트 배열의 특수함
  • 25632 소수 부르기 게임
  • 대충만든자판 javascript
  • 13460 javascript nodejs
  • 1753 최단경로 javascript
  • 카카오 코딩테스트 양궁대회 nodeJS
  • 외벽 점검 javascript
  • 억억단을 외우자 javascript
  • 자바스크립트 sort는 왜 그모양일까
  • 자바스크립트 커링
  • 퀵정렬 자바스크립트
  • 깃 이전 커밋에서 새 브랜치 만들기
  • 자바스크립트 이벤트 위임
  • 프로그래머스 숫자카드나누기 javascript

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae
DS & Algorithm/baekjoon

[백준] 15990번 1, 2, 3 더하기 5 - JavaScript(NodeJS)

DS & Algorithm/baekjoon

[백준] 15990번 1, 2, 3 더하기 5 - JavaScript(NodeJS)

2021. 6. 9. 12:20

문제

 

15990번: 1, 2, 3 더하기 5

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.

www.acmicpc.net

 

풀이

숫자 n을 1,2,3의 합으로 표현하는 경우의 수를 구한다.

1,2,3을 여러 번 사용할 수 있으나, 연속되게 사용하면 안된다.

숫자 4를 표현할 때 1+1+2, 2+2 와 같이 연속되게 같은 숫자를 사용할 수 없다.

 

이 문제는 dp 유형으로 점화식을 구해야 한다.

 

우선 1부터 시작해보자.

 

n=1 일 때, 1
n=2 일 때, 2
n=3 일 때, 1+2, 2+1, 3
n=4 일 때, 1+2+1, 1+3, 3+1
n=5 일 때, 1+3+1, 2+1+2, 3+2, 2+3

 

사실 이렇게만 보면 점화식을 파악하기 어려울 수 있다.

 

 

마지막 숫자를 기준으로 생각해본다.

 

n이 100일 때, 마지막 숫자가 1일 경우는
... +2 +1
... +3 +1
2가지이다.

 

마지막 숫자 앞에 더해진 숫자가 2이거나 3이어야 한다.

즉 n=99일 때 마지막에 더해진 숫자가 2이거나 3인 경우의 수를 더해주면, n=100일 때 마지막 숫자가 1인 경우의 수가 된다.

 

마찬가지로 마지막 숫자가 2일 경우 역시
... +1 +2
... +3 +2
2가지이다.

 

마지막에 2를 더해야 하므로, n=98일 때 마지막 숫자가 1이거나 3인 경우의 수를 더하면 된다.

 

 

그러므로 2차원 배열을 이용해 1~N 까지 마지막 숫자가 1,2,3이 들어가는 경우의 수를 구해야 한다.

 

숫자 N의 경우의 수를 구할 때, 마지막 숫자가 1,2,3인 경우의 수를 모두 더해주면 된다.

 

코드

function sol(input) {
  const MOD = 1000000009;
  const SIZE = 100000;
  const dp = Array.from({ length: SIZE + 1 }, () => new Array(4).fill(0));

  // for 문에서 i-1 ~ i-3이 무난하게 동작하기 위해 n=1,2,3 값을 채운다.
  dp[1][1] = dp[2][2] = dp[3][1] = dp[3][2] = dp[3][3] = 1;
  for (let i = 4; i < SIZE + 1; i++) {
    dp[i][1] = (dp[i - 1][2] + dp[i - 1][3]) % MOD;
    dp[i][2] = (dp[i - 2][1] + dp[i - 2][3]) % MOD;
    dp[i][3] = (dp[i - 3][1] + dp[i - 3][2]) % MOD;
  }

  let answer = "";
  input.slice(1).map((n) => {
    n = +n;
    answer += `${(dp[n][1] + dp[n][2] + dp[n][3]) % MOD}\n`;
  });
  return answer;
}

// 백준에서 입력을 받는 코드
const input = [];
require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    input.push(line);
  })
  .on("close", () => {
    console.log(sol(input));
    process.exit();
  });
저작자표시 (새창열림)

'DS & Algorithm > baekjoon' 카테고리의 다른 글

[백준] 1037번 약수 - JavaScript(NodeJS)  (0) 2021.07.01
[백준] 1152번 단어의 개수 - JavaScript(NodeJS)  (0) 2021.07.01
[백준] 1157번 단어 공부 - JavaScript(NodeJS)  (0) 2021.06.09
[백준] 9663번 N-Queen - JavaScript(NodeJS)  (1) 2021.06.08
[백준] 16198번 에너지 모으기 - JavaScript(NodeJS)  (0) 2021.06.08
  • 문제
  •  
  • 풀이
  •  
  • 코드
'DS & Algorithm/baekjoon' 카테고리의 다른 글
  • [백준] 1037번 약수 - JavaScript(NodeJS)
  • [백준] 1152번 단어의 개수 - JavaScript(NodeJS)
  • [백준] 1157번 단어 공부 - JavaScript(NodeJS)
  • [백준] 9663번 N-Queen - JavaScript(NodeJS)
jiho_bae
jiho_bae
하루에 한 걸음씩

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.