
문제를 간략하게 설명하면 다음과 같다.
알파벳 A ~ Z 까지 1 ~ 26이라고 할 떄,
예를 들어 "BEAN"을 암호화하면 25114가 나오는데, 25114를 다시 영어로 바꾸면, "BEAAD", "YAAD", "YAN", "YKD", "BEKD", "BEAN" 총 6가지가 나온다.
입력으로 암호가 주어졌을 때, 해당 암호의 해석이 몇가지가 가능한지 구하여라.
우선 dp[i] 암호를 0번쨰부터 순서대로 봤을 때, i번째에서의 경우의 수를 저장하자.
예를들어 "25114" 라고 하면 dp[2] 는 "25"의 경우의 수이다.
그럼 여기서 우리가 고려할 것들을 생각해보자.
이 조건을 고려하여 코드를 작성하면 끝이다.
전체 풀이
let fs = require("fs");
let input = require("fs").readFileSync(0, 'utf-8').toString().trim().split("\n");
let N = input.shift().split('').map(Number);
const solution = () => {
let dp = new Array(N.length + 1).fill(0);
// 0부터 시작하면 종료.
if (N[0] === 0) return 0;
// 초기값 지정.
dp[0] = 1;
dp[1] = 1;
// 나머지 dp 배열 채워줌.
for (let i = 2; i < dp.length; i++) {
// 만약 i번쨰 숫자가 0이 아니면.
// 이전의 경우의 수만큼 더해줌.
if (N[i - 1] !== 0) {
dp[i] = (dp[i - 1] + dp[i]) % 1000000;
}
// 만약 0부터 26 사이의 숫자이고, i - 1 번째 숫자가 0이 아니라면.
dp[i] = N[i - 2] * 10 + N[i - 1] > 26 || N[i - 2] === 0 ? dp[i] % 1000000 : (dp[i] + dp[i - 2]) % 1000000;
}
return dp[dp.length - 1];
};
console.log(solution() % 1000000);
해당 문제를 풀고 질문 게시판을 보다가 입력 받는 주소가 "/dev/stdin"이면 가끔 런타임 에러가 나는 문제들을 readFileSync(0, "utf-8")로 고치면 해결 된다는 것을 확인할 수 있었다. 앞으로 입력 주소는 readFileSync(0, "utf-8")를 이용해 풀어야겠다.