1️⃣ 문제
2️⃣ 문제 해결 전략
3️⃣ 코드 및 설명
내 코드
function solution(s) { var answer = new Set([]); function dfs(curIdx, arr) { if (curIdx === s.length) { console.log(arr); return; } for (let count = 1; count <= 2; count++) { if (curIdx + count > s.length) { break; } let newStr = Array.from(s).slice(curIdx, curIdx + count); const slicedNum = Number(newStr.join("")); if (slicedNum > 0 && slicedNum <= 26) { dfs(curIdx + count, [...arr, slicedNum]); } } } dfs(0, []); return answer.size; }
모범 코드
function solution(s) { const n = s.length; if (n === 0) return 0; // dp[i]: s[0...i-1]까지 해독할 수 있는 방법의 수 const dp = Array(n + 1).fill(0); dp[0] = 1; // 빈 문자열은 1가지 방법(아무것도 안 뽑음) dp[1] = s[0] !== "0" ? 1 : 0; // 첫글자가 0이 아니라면 1가지 for (let i = 2; i <= n; i++) { // 한 자리 변환 let one = +s[i - 1]; if (one >= 1 && one <= 9) { dp[i] += dp[i - 1]; } // 두 자리 변환 let two = +s.slice(i - 2, i); if (two >= 10 && two <= 26) { dp[i] += dp[i - 2]; } } return dp[n]; }