빈도 수 패턴 문제

정재성·2022년 9월 26일
0
post-thumbnail

애너그램 도전 과제

두 문자열이 주어질 때, 두 문자열에 대해 서로 애너그램일 경우 true, 아닐경우 false 를 반환하는 코드를 작성하라.

즉 문자의 순서는 다를 수 있으나 각 문자의 수는 동일해야 하며 문자의 길이 또한 동일해야 한다.


function validAnagram(str1, str2) {
  // 두 문자열의 길이가 같은지 검토. 다르다면 false 반환
  if (str1.length !== str2.length) {
    return false;
  }
  if (str1 === str2) return true;
  // 두 문자열의 비교하기 위한 객체 생성
  let frequencyCounter1 = {};
  let frequencyCounter2 = {};

  // str1 의 각 문자 수 세기
  for (let val of str1) {
    frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1;
  }
  console.log(frequencyCounter1)
  // str2 의 각 문자 수 세기
  for (let val of str2) {
    frequencyCounter2[val] = (frequencyCounter2[val] || 0) + 1;
  }
  // 생성한 두 객체의 키가 같은지 비교
  for (let key in frequencyCounter1) {
    if (!(key in frequencyCounter2)) {
      return false;
    }
    if (frequencyCounter2[key] !== frequencyCounter1[key]) {
      return false;
    }
  }
  // 위 모든 과정에 옳다면 true 반환
  return true;
}
validAnagram('anagram', 'nagaram')

다른 풀이

function validAnagram(first, second) {
  if (first.length !== second.length) {
    return false;
  }

  const lookup = {};

  for (let i = 0; i < first.length; i++) {
    let letter = first[i];
    // if letter exists, increment, otherwise set to 1
    lookup[letter] ? (lookup[letter] += 1) : (lookup[letter] = 1);
  }

  for (let i = 0; i < second.length; i++) {
    let letter = second[i];
    // can't find letter or letter is zero then it's not an anagram
    if (!lookup[letter]) {
      return false;
    } else {
      lookup[letter] -= 1;
    }
  }
  return true;
}
profile
기술블로그 / 일상블로그

0개의 댓글