아나그램이란 무엇인가
아나그램(Anagram)은 주어진 문자열의 문자를 재배열하여 다른 문자열을 만들 수 있는 경우를 의미합니다. 예를 들어, 'listen'과 'silent'는 서로의 문자를 재배열해서 만들 수 있으므로 아나그램입니다. 이 문제는 문자열의 구성 요소를 비교하여 두 문자열이 동일한 문자 집합을 갖는지를 판단하는 방식으로 해결할 수 있습니다.
자바스크립트를 활용하여 아나그램을 판별하는 여러 가지 방법을 알아보겠습니다.
방법 1: 정렬 후 비교하는 방식
가장 직관적인 방법은 두 문자열을 정렬한 뒤 같은지 비교하는 방식입니다.
function isAnagramSorted(str1, str2) {
const normalize = str => str.replace(/[^a-zA-Z]/g, '').toLowerCase().split('').sort().join('');
return normalize(str1) === normalize(str2);
}
console.log(isAnagramSorted('listen', 'silent')); // true
console.log(isAnagramSorted('hello', 'world')); // false
장점: 구현이 간단하고 코드가 짧습니다.
단점: 정렬 과정에서 O(n log n)의 시간 복잡도가 발생합니다. 대용량 문자열 비교에는 부적절할 수 있습니다.
방법 2: 해시 테이블로 문자 수 비교
문자 수를 세는 방식으로 아나그램을 판별할 수 있습니다. 문자열의 각 문자를 키로 하여 빈도를 기록한 후, 두 문자열의 빈도 테이블을 비교하는 방식입니다.
function isAnagramHash(str1, str2) {
if (str1.length !== str2.length) return false;
const charCount = {};
for (let char of str1) {
charCount[char] = (charCount[char] || 0) + 1;
}
for (let char of str2) {
if (!charCount[char]) return false;
charCount[char]--;
}
return true;
}
console.log(isAnagramHash('binary', 'brainy')); // true
console.log(isAnagramHash('test', 'taste')); // false
장점: 시간 복잡도 O(n)으로 효율적입니다.
단점: 소문자, 대문자, 공백 등을 정규화하지 않으면 정확한 비교가 어려울 수 있습니다.
방법 3: Map 객체를 활용한 최적화
ES6의 Map 객체를 사용하면 명확한 키-값 매핑으로 성능과 가독성을 모두 확보할 수 있습니다.
function isAnagramMap(str1, str2) {
if (str1.length !== str2.length) return false;
const countMap = new Map();
for (let char of str1) {
countMap.set(char, (countMap.get(char) || 0) + 1);
}
for (let char of str2) {
if (!countMap.has(char)) return false;
countMap.set(char, countMap.get(char) - 1);
if (countMap.get(char) < 0) return false;
}
return true;
}
console.log(isAnagramMap('elbow', 'below')); // true
console.log(isAnagramMap('state', 'taste')); // true
장점: 중복 문자 처리나 성능 측면에서 안정적입니다.
단점: 코드가 길어지므로 비교적 복잡해 보일 수 있습니다.
방법 비교 요약
| 방식 | 시간 복잡도 | 장점 | 단점 |
| 정렬 비교 | O(n log n) | 간단하고 직관적 | 느릴 수 있음 |
| 해시 테이블 | O(n) | 빠르고 메모리 효율적 | 문자 전처리가 필요 |
| Map 객체 활용 | O(n) | 성능 안정적, 구조 명확 | 코드 복잡도 높음 |
문자열의 길이가 짧고 단순한 경우에는 정렬 방식도 무난하게 사용할 수 있지만, 문자열이 길거나 비교 횟수가 많을 경우에는 해시 기반 방식이 더욱 적합합니다.
마무리 및 추천 자료
아나그램 판별 문제는 문자열 처리, 해시 활용, 정렬 이해 등 다양한 기본기를 종합적으로 연습할 수 있는 좋은 알고리즘 문제입니다. 문제를 다양한 방법으로 접근하면서 시간 복잡도와 코드 구조를 함께 고려하는 연습을 통해 실력을 키울 수 있습니다.
아래는 알고리즘 문제 해결 능력을 높이기 위한 무료 학습 리소스입니다:
문제를 다양한 방식으로 구현해보는 경험은 실전에서도 큰 도움이 됩니다.
'Programing > Algorithm' 카테고리의 다른 글
| JavaScript로 구현하는 피보나치 수열 (Fibonacci Sequence) (1) | 2025.06.03 |
|---|---|
| JavaScript로 구현하는 소수 판별 (Prime Check) (0) | 2025.05.26 |
| JavaScript로 구하는 최대공약수와 최소공배수 (GCD / LCM) (0) | 2025.05.26 |
| JavaScript로 검사하는 회문 문자열 (Palindrome Check) (0) | 2025.05.23 |
| JavaScript로 배우는 문자열 뒤집기 (String Reverse) (0) | 2025.05.23 |
| 피보나치 수열의 이해와 자바스크립트 구현 (0) | 2025.05.22 |
| JavaScript로 이해하는 하노이의 탑 (Tower of Hanoi) (0) | 2025.05.22 |
| JS 피보나치(Fibonacci) (0) | 2025.05.22 |