[JavaScript] 백준 2011 암호 코드 (JS)

SanE·2024년 5월 8일

Algorithm

목록 보기
101/127

암호 코드

📚 문제 설명


문제를 간략하게 설명하면 다음과 같다.

알파벳 A ~ Z 까지 1 ~ 26이라고 할 떄,
예를 들어 "BEAN"을 암호화하면 25114가 나오는데, 25114를 다시 영어로 바꾸면, "BEAAD", "YAAD", "YAN", "YKD", "BEKD", "BEAN" 총 6가지가 나온다.

입력으로 암호가 주어졌을 때, 해당 암호의 해석이 몇가지가 가능한지 구하여라.

👨🏻‍💻 풀이 과정


우선 dp[i] 암호를 0번쨰부터 순서대로 봤을 때, i번째에서의 경우의 수를 저장하자.
예를들어 "25114" 라고 하면 dp[2] 는 "25"의 경우의 수이다.

그럼 여기서 우리가 고려할 것들을 생각해보자.

  • 0부터 시작하는 암호는 불가능.
  • 01 혹은 04 같은 경우는 불가능.
  • 1부터 26 사이의 숫자여야 한다.
  • 만약 0이 나온다면 무조건 그 앞에 1 혹은 2가 나와야 한다.

이 조건을 고려하여 코드를 작성하면 끝이다.

전체 풀이

    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")를 이용해 풀어야겠다.

profile
JavaScript를 사용하는 모두를 위해...

0개의 댓글