TIL 87 | isAnagram (정규표현식, 아스키코드)

Gom·2021년 6월 11일
0

Algorithm

목록 보기
44/48

문제

Modify the String prototype to add a new method isAnagram.
isAnagram takes a single string argument. It returns true if that string
is an anagram of the string it was called on, and false otherwise.

Example:
("roasting").isAnagram("organist"); // true
("presence").isAnagram("presents"); // false
Anagrams should ignore spaces, punctuation, and capitalization:
("Quid est veritas?").isAnagram("Est vir qui adest."); // true

Anagram이란

접근

큰 흐름은 이렇다.
공백과 특수문자를 제외한 문자만 추출
문자열의 구성성분이 동일한 지 확인

1차

  • 정규표현식을 이용하여 공백, 특수문자를 제거
  • 남은 문자들의 길이를 비교하여 early return 시킴
  • 유사배열인 문자열을 배열로 만들어 정렬한 뒤 정렬된 채로 string화 시켜 한 번에 비교

String.prototype.isAnagram = function (string) {
  const reg =  /[ \{\}\[\]\/?.,;:|\)*~`!^\-_+┼<>@\#$%&\ '\"\\(\=]/gi;
  let [str1, str2] = [this.replace(reg, ""), string.replace(reg, "")];

  if (str1.length !== str2.length) {
    return false;
  }else {
    str1 = Array.from(str1.toUpperCase()).sort();
    str2 = Array.from(str2.toUpperCase()).sort();
    
    return str1.toString() === str2.toString();
  };
}

2차

  • 정규표현식이 아닌 다른 방식을 고안해보라는 동료 피드백이 있어 ASCII코드를 이용해 문자만을 추출하는 방식으로 개선해보았다.
  • 기능별 함수로 묶어 중복 코드를 줄여보았다.
    👀 (함수 호출에도 비용이 드니 함수가 많이 활용되지 않을 경우라면 굳이 함수를 만들 필요가 없지 않을까?하는 생각이었다. 그러나 함수 선언을 통해 코드 중복 뿐 아니라 해당 코드가 어떤 기능을 하는 지 직관적으로 알리는 효과를 얻을 수 있고 함수 호출 비용까지 고려하여 코드를 작성하여야 하는 경우는 엄격한 제약 조건이 주어진 특수한 상황 정도라고 한다.)

String.prototype.isAnagram = function (string) {
  let [str1, str2] = [Array.from(this.toUpperCase()), Array.from(string.toUpperCase())];
  
  function standardizeStr (str) {
    const _str = Array.from(str.toUpperCase());
    const result = _str.fillter(char => char.charCodeAt() >= 65 && char.charCodeAt() <= 90);
    
    return result;
  }

  if (str1.length !== str2.length) {
    return false;
  }else {
    str1 = Array.from(str1.toUpperCase()).sort();
    str2 = Array.from(str2.toUpperCase()).sort();
    
    return str1.toString() === str2.toString();
  };
}
profile
안 되는 이유보다 가능한 방법을 찾을래요

0개의 댓글