팬그램(Pangram) 문자열이란?
팬그램(Pangram)은 영어 알파벳 26개 글자 a부터 z까지 모든 문자를 최소 한 번 이상 포함하는 문자열을 의미합니다. 대표적인 예로 "The quick brown fox jumps over the lazy dog"이라는 문장이 있으며, 이 문장은 알파벳 전체를 담고 있어 가장 유명한 팬그램으로 꼽힙니다.
이번 문제에서는 문자열을 첫 번째이자 유일한 인자로 받아, 해당 문자열이 팬그램인지 아닌지를 판별하는 JavaScript 함수를 작성해야 합니다. 여기서는 편의상 소문자 알파벳만 고려하도록 하겠습니다.
접근 방법
가장 직관적인 방법은 다음과 같습니다.
- 입력 문자열을 소문자로 변환합니다.
- 알파벳 전체(a~z)를 배열로 준비합니다.
- 문자열을 순회하면서 각 문자가 알파벳 배열에 존재하면 해당 문자를 배열에서 제거합니다.
- 순회가 끝난 후 배열이 비어 있다면 모든 알파벳이 등장했다는 뜻이므로 팬그램입니다.
예시 코드
위 로직을 구현한 코드는 다음과 같습니다.
const str = 'We promptly judged antique ivory buckles for the next prize';
const isPangram = (str = '') => {
str = str.toLowerCase();
const { length } = str;
const alphabets = 'abcdefghijklmnopqrstuvwxyz';
const alphaArr = alphabets.split('');
for (let i = 0; i < length; i++) {
const el = str[i];
const index = alphaArr.indexOf(el);
if (index !== -1) {
alphaArr.splice(index, 1);
}
}
return !alphaArr.length;
};
console.log(isPangram(str));
출력 결과
코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
true
예제 문자열 "We promptly judged antique ivory buckles for the next prize"에는 알파벳 26개 글자가 모두 포함되어 있으므로, 함수는 true를 반환합니다.
참고: 더 효율적인 방법
위 코드는 정상적으로 동작하지만, indexOf와 splice를 반복 사용하기 때문에 성능 면에서 비효율적일 수 있습니다. 실무에서는 Set 객체를 활용하는 방법이 더 간결하고 빠릅니다.
const isPangram = (str = '') => {
return new Set(str.toLowerCase().replace(/[^a-z]/g, '')).size === 26;
};
이 코드는 알파벳이 아닌 문자를 제거한 뒤 Set으로 중복을 제거하고, 그 크기가 26이면 팬그램으로 판단합니다.