Anagram_애너그램 #2

찌끅·2023년 8월 24일

애너그램

두 단어의 글자 나열 순서는 다르지만 구성이 일치하는 것을 의미한다.
즉, 단어나 구절을 재배열하여 동일한 문자들로 이루어진 다른 단어나 구절을 만드는 문제이다.

1. split(), sort(), join() 이용

const strA = "listen";
const strB = "silent";

// listen -> split()으로 배열로 만듦 ->  sort()로 정렬 -> join()으로 다시 문자열로 만듦
function isAnagramA(strA, strB) {
  if (strA.length !== strB.length) {
    return false;
  }
  return strA.split("").sort().join() === strB.split("").sort().join();
}

console.log(isAnagramA(strA, strB));

우선 두 문자열의 길이가 다르면 false를 return 해준다.
길이가 같다면 split("")을 사용하여 문자열을 문자 단위로 쪼개서 배열로 만든다. 분리된 문자 배열들을 sort()로 정렬한다.
문자열을 쪼개고 정렬하면 ["e", "i", "l", "n", "s", "t"]이러한 배열이 된다. join() 함수를 사용하여 다시 문자열로 결합한다. 이러한 과정을 거친 후 strA와 strB가 같으면 true 아니면 false를 반환한다.

2. Hash Map 이용

해시 맵은 데이터를 저장하는 자료 구조 중 하나로, 키(key)와 값(value)의 쌍을 저장하고 검색, 삽입, 삭제하는데 사용된다.

const strA = "listen";
const strB = "silent";

function isAnagramB(strA, strB) {
  if (strA.length !== strB.length) {
    return false;
  }
  const hashMap = {};
  for (const char of strA) {
    // {l:1, i:1, s:1 ...}
    hashMap[char] = hashMap[char] ? hashMap[char] + 1 : 1;
  }
  for (const char of strB) {
    if (!hashMap[char]) {
      return false;
    }
    hashMap[char]--;
  }
  return true;
}

console.log(isAnagramB(strA, strB));

마찬가지로 두 문자열의 길이가 다르면 false를 반환한다.
hashMap이라는 빈 객체를 만들고 각 문자의 출현 빈도를 기록하기 위한 용도로 사용한다.
strA를 for of 루프를 사용하여 문자열을 문자 단위로 순회하며 객체에 문자를 키로 하고 해당 문자의 출현 빈도를 값으로 기록한다. 이미 기록된 문자라면 해당 문자의 값에 1을 더하고, 처음 등장하는 문자라면 1로 초기화 한다.
strB를 순회하며 객체에 해당 문자가 존재하지 않거나 이미 출현 빈도가 0인 경우 두 문자열이 애너그램이 아니라고 판단하고 false를 반환한다. 그렇지 않으면 해당 문자의 출현 빈도를 1 감소 시킨다.
모든 문자열을 처리 후 여전히 hashMap에 값이 남아있는 경우는 애너그램이 아니므로 false를 반환한다. 아니라면 애너그램이므로 true를 반환한다.

0개의 댓글