본문 바로가기
  • soldonii's devlog
Javascript 공부/알고리즘 풀이

자바스크립트 알고리즘(1) - anagram

by soldonii 2019. 8. 26.

*Udemy의 "The Coding Interview Bootcamp: Algorithms + Data Structures" 강의에서 학습한 내용을 정리한 포스팅입니다.

*https://soldonii.github.io에서 작성한 글을 티스토리로 옮겨온 포스팅입니다.

*자바스크립트를 배우는 단계라 오류가 있을 수 있습니다. 틀린 내용은 댓글로 말씀해주시면 수정하겠습니다. 감사합니다. :)


지문

/ Check to see if two provided strings are anagrams of eachother.
// One string is an anagram of another if it uses the same characters
// in the same quantity. Only consider characters, not spaces
// or punctuation.  Consider capital letters to be the same as lower case
// --- Examples
//   anagrams('rail safety', 'fairy tales') --> True
//   anagrams('RAIL! SAFETY!', 'fairy tales') --> True
//   anagrams('Hi there', 'Bye there') --> False

 

1번 풀이

1. 각 string에 대해서 charMap을 만들 함수를 구현한다.

    1-1. 빈 객체를 만든다.

    1-2. 문제의 조건에 맞는 문자열만 남기기 위해 정규표현식을 사용한다. 이후 toLowerCase() 한 값을 str 로 저장한다.

    1-3. for loop을 통해 charMap을 만든다.

2. 두 argument 모두에 대해서 만들어진 charMap을 변수에 저장한다.

3. 두 객체의 key(또는 value)의 길이가 다르다면, 애초에 같은 문자가 사용된 것이 아니므로 false.

4. 길이가 같을 경우, 두 객체에서 같은 key(여기에서는 character)에 대한 value를 구했을 때 값이 다르면, 같은 문자열이 사용된 횟수가 각각 다르다는 의미이므로 false. 그렇지 않을 경우에는 true.

 

function anagrams(stringA, stringB) {
  const charMapA = makeCharMap(stringA);
  const charMapB = makeCharMap(stringB);

  if (Object.keys(charMapA).length !== Object.keys(charMapB).length) {
    return false;
  }

  for (let char in charMapA) {
    if (charMapA[char] !== charMapB[char]) {
      return false;
    } else {
      return true;
    }
  }
}

function makeCharMap(str) {
  let charMap = {};
  str = str.replace(/[^\w]/g, "").toLowerCase();
  for (let char of str) {
    charMap[char] = charMap[char] + 1 || 1;
  }
  return charMap;
}

 

2번 풀이 : sort()

1. 문자열을 원하는 방식대로 sort하는 기능의 function을 만든다.

    1-1. 원본 문자열을 조건에 맞게 공백 및 특수문자를 제거한 후 소문자로 다 바꿔준다.

    1-2. 바꾼 문자열을 split으로 배열로 바꿨다가, sort를 하고, 다시 join하여 문자열로 바꿔준다.

2. sort를 동일하게 했기 때문에 만약 같은 문자열이 같은 횟수만큼 사용되었다면, 최종 문자열도 같을 것이다.

 

function anagrams(stringA, stringB) {
  return cleanString(stringA) === cleanString(stringB);
}

function cleanString(str) {
  return str = str.replace(/[^\w]/g, "").toLowerCase().split('').sort().join('');
}

댓글