팬디지털(Pandigital) 숫자란 0부터 9까지의 모든 자릿수를 최소 한 번 이상 포함하는 수를 말합니다. 예를 들어 53657687691428890은 0~9의 모든 숫자가 등장하므로 팬디지털 숫자입니다.
이번 글에서는 숫자를 나타내는 문자열을 입력받아, 해당 숫자가 팬디지털인지 여부를 판별하는 JavaScript 함수를 작성해 보겠습니다. 함수는 팬디지털 숫자일 경우 true, 그렇지 않으면 false를 반환합니다.
구현 아이디어
핵심 로직은 간단합니다. 먼저 0부터 9까지의 숫자 목록(legend)을 준비한 뒤, 입력 문자열을 한 글자씩 순회하면서 해당 숫자가 목록에 존재하면 제거합니다. 모든 문자를 확인한 후 목록이 비어 있다면, 모든 자릿수가 최소 한 번씩 등장했다는 뜻이므로 팬디지털 숫자라고 판단할 수 있습니다.
예제 코드
const numStr1 = '47458892414';
const numStr2 = '53657687691428890';
const isPandigital = numStr => {
let legend = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
for(let i = 0; i < numStr.length; i++){
if(!legend.includes(numStr[i])){
continue;
};
legend.splice(legend.indexOf(numStr[i]), 1);
};
return !legend.length;
};
console.log(isPandigital(numStr1));
console.log(isPandigital(numStr2));실행 결과
콘솔 출력 결과는 다음과 같습니다.
false true
코드 설명
첫 번째 문자열 '47458892414'에는 0, 3, 6이 포함되어 있지 않으므로 false가 반환됩니다. 반면 두 번째 문자열 '53657687691428890'은 0부터 9까지 모든 숫자를 포함하고 있으므로 true가 반환됩니다.
더 간결한 대안: Set 활용하기
입력 문자열이 숫자로만 구성되어 있다는 조건이라면, Set 객체를 이용해 훨씬 간결하게 구현할 수도 있습니다. 고유한 문자의 개수가 정확히 10개라면 모든 자릿수가 존재한다는 의미이기 때문입니다.
// 문자열이 숫자로만 구성되어 있다는 가정 하에
const isPandigital = numStr => new Set(numStr).size === 10;
console.log(isPandigital('47458892414')); // false
console.log(isPandigital('53657687691428890')); // true두 방식 모두 시간 복잡도는 문자열 길이에 비례하여 O(n)으로 효율적이며, 상황에 맞게 선택하여 사용하면 됩니다.