Programing/Algorithm

JavaScript로 푸는 아나그램 판별 (Anagram Detection)

2025. 5. 23. 08:23
반응형

아나그램이란 무엇인가

아나그램(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) 성능 안정적, 구조 명확 코드 복잡도 높음

문자열의 길이가 짧고 단순한 경우에는 정렬 방식도 무난하게 사용할 수 있지만, 문자열이 길거나 비교 횟수가 많을 경우에는 해시 기반 방식이 더욱 적합합니다.


마무리 및 추천 자료

아나그램 판별 문제는 문자열 처리, 해시 활용, 정렬 이해 등 다양한 기본기를 종합적으로 연습할 수 있는 좋은 알고리즘 문제입니다. 문제를 다양한 방법으로 접근하면서 시간 복잡도와 코드 구조를 함께 고려하는 연습을 통해 실력을 키울 수 있습니다.

아래는 알고리즘 문제 해결 능력을 높이기 위한 무료 학습 리소스입니다:

  • 프로그래머스 알고리즘 입문 강의
  • LeetCode Anagram Problems
  • replit JavaScript 실습 환경

문제를 다양한 방식으로 구현해보는 경험은 실전에서도 큰 도움이 됩니다.

반응형

'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
'Programing/Algorithm' 카테고리의 다른 글
  • JavaScript로 구하는 최대공약수와 최소공배수 (GCD / LCM)
  • JavaScript로 검사하는 회문 문자열 (Palindrome Check)
  • JavaScript로 배우는 문자열 뒤집기 (String Reverse)
  • 피보나치 수열의 이해와 자바스크립트 구현
Dongkkase
Dongkkase
개발자로 일하면서 부딪히는 문제풀이가 누군가에게 도움이 되길 바라며
    반응형
  • Dongkkase
    정집사의 개발로그
    Dongkkase
  • 전체
    오늘
    어제
    • All (478)
      • 금융 (61)
      • Programing (295)
        • Algorithm (39)
        • API (2)
        • javascript (122)
        • CSS (8)
        • HTML (10)
        • PHP (15)
        • JAVA (27)
        • JSP (17)
        • JSP 예제 (1)
        • IOS (1)
        • Android (1)
        • Sencha Touche (1)
        • bat file, cmd (0)
        • 디버깅 (2)
        • SQL (21)
        • MS-SQL (1)
        • MySQL (13)
        • 보안 (5)
      • Server (14)
        • Docker (1)
        • Windows (9)
        • Linux (3)
        • jeus (1)
      • Database (6)
      • IT 일반 (15)
      • 리뷰 (38)
        • Book (17)
        • 제품 (2)
        • 영화 소개 (11)
        • 음악 소개 (7)
      • 잡생각 (36)
        • 회고 (3)
        • 컬럼 (4)
        • 자료실 (6)
        • 낙서장 (12)
        • 위시리스트 (2)
        • WOW (1)
        • 덕 (1)
  • 인기 글

  • 최근 댓글

  • 태그

    자바스크립트유틸
    IT·컴퓨터
    php
    기초
    SQL
    디자인패턴
    위시리스트
    자바
    자바스크립트
    iT's MY LiFE
    It
    Java
    IT블로그
    JavaScript
    읽고 싶은 책
    블로그
    IT 관련
    jsp
    js패턴
    사고 싶은 책
Dongkkase
JavaScript로 푸는 아나그램 판별 (Anagram Detection)
상단으로

티스토리툴바