diff --git a/combination-sum/moonjonghoo.js b/combination-sum/moonjonghoo.js new file mode 100644 index 000000000..8463321b7 --- /dev/null +++ b/combination-sum/moonjonghoo.js @@ -0,0 +1,28 @@ +function combinationSum(candidates, target) { + const result = []; + + // 1. 정렬: 가지치기를 위한 필수 + candidates.sort((a, b) => a - b); + + function backtrack(startIndex, path, remaining) { + if (remaining === 0) { + result.push([...path]); + return; + } + + for (let i = startIndex; i < candidates.length; i++) { + const current = candidates[i]; + + // 2. 가지치기 + if (current > remaining) break; + + // 3. 현재 값 선택 + path.push(current); + backtrack(i, path, remaining - current); // i로 재귀 호출: 같은 수 중복 사용 가능 + path.pop(); // 4. 백트래킹 + } + } + + backtrack(0, [], target); + return result; +} diff --git a/decode-ways/moonjonghoo.js b/decode-ways/moonjonghoo.js new file mode 100644 index 000000000..4402a313d --- /dev/null +++ b/decode-ways/moonjonghoo.js @@ -0,0 +1,24 @@ +function numDecodings(s) { + const n = s.length; + + if (s[0] === "0") return 0; + + const dp = new Array(n + 1).fill(0); + dp[0] = 1; + dp[1] = 1; + + for (let i = 2; i <= n; i++) { + const oneDigit = Number(s.slice(i - 1, i)); + const twoDigits = Number(s.slice(i - 2, i)); + + if (oneDigit >= 1 && oneDigit <= 9) { + dp[i] += dp[i - 1]; + } + + if (twoDigits >= 10 && twoDigits <= 26) { + dp[i] += dp[i - 2]; + } + } + + return dp[n]; +} diff --git a/valid-palindrome/moonjonghoo.js b/valid-palindrome/moonjonghoo.js new file mode 100644 index 000000000..cd169549e --- /dev/null +++ b/valid-palindrome/moonjonghoo.js @@ -0,0 +1,17 @@ +/** + * @param {string} s + * @return {boolean} + */ + +var isPalindrome = function (s) { + // 1. 영숫자만 남기고, 소문자로 변환 + let cleaned = s.toLowerCase().replace(/[^a-z0-9]/g, ""); + + // 2. 뒤집기 + let reversed = cleaned.split("").reverse().join(""); + + // 3. 비교 + return cleaned === reversed; +}; + +isPalindrome("A man, a plan, a canal: Panama");