-
[알고리즘/자바스크립트] 아나그램 판별하기 (is Anagram)Algorithm 2019. 7. 16. 12:07
문제:
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:
isAnagram("roasting", "organist"); // true isAnagram("presence", "presents"); // false
Anagrams should ignore spaces, punctuation, and capitalization:
isAnagram("Quid est veritas?", "Est vir qui adest."); // true
Extra credit: It is bad practice to extend a native prototype with enumerable properties. Make your isAnagram method non-enumerable.
string 2개가 주어지는데 각 문장이 아나그램인지 아닌지 판별하여 true/false를 리턴하는 문제이다.
아나그램이란 일종의 어떠한 단어의 문자를 재배열하여 다른 뜻을 가지는 다른 단어로 바꾸는 것을 말한다.
공백이나 문장부호, 대소문자는 무시하고 판별한다. 또한 모든 개별 알파벳이 전부 사용되어야한다.
나의 풀이는 다음과 같다.
1.
하나의 기준이 되는 string으로 배열을 만든 후,
각 문자가 알파벳이라면 객체에 키값으로 넣고 개수를 세서 객체에 담는다.
2.
나머지 string을 배열로 만들어 순회하면서
아까 만들어둔 객체에 존재하면 개수를 -1한 후 0보다 크거나 작은지 판별하여
만약에 0보다 작아지거나 아니면 아예 객체에 키값이 존재하지 않는다면
verifyAnagram 변수에 false를 리턴한다.
3.
만약에 verifyAnagram 변수가 true라면
객체에 남아있는 값들 중 0이 아닌 값이 존재하는지 판별하여 리턴하고
false를 리턴했다면 그대로 false를 리턴한다.
var isAnagram = function(string1, string2) { var charArr = string2.toLowerCase().split(''); var isOnlyChars = (c) => c.charCodeAt() >= 97 && c.charCodeAt() <= 122; var charList = charArr.reduce((chars, c) => { if (isOnlyChars(c)) { chars[c] = (!chars[c]) ? 1 : ++chars[c]; } return chars; }, {}); var comparison = string1.toLowerCase().split(''); var verifyAnagram = comparison.every((c) => { if (!isOnlyChars(c)) { return true; } return (charList[c]) ? --charList[c] >= 0 : false; }); if (verifyAnagram) { return Object.values(charList).every((n) => !n); } else { return verifyAnagram; } };
좀 더 간단한 다른 방법을 생각해보았다.
1. 두 string을 배열로 만든 다음 알파벳만 추려서 새로운 배열을 만든다.
2. 새로 만든 두 배열들을 sort() 메소드를 사용하여 정렬한다.
3. 두 배열이 완벽하게 일치하면 true를, 다른 요소가 있다면 false를 리턴한다.
var isAnagram = function(string1, string2) { var charArr = string1.toLowerCase().split(''); var charArr2 = string2.toLowerCase().split(''); var isOnlyChars = (c) => c.charCodeAt() >= 97 && c.charCodeAt() <= 122; var makeOnlyCharArr = (array) => { return array.reduce((chars, c) => { if (isOnlyChars(c)) { chars.push(c); } return chars; }, []).sort(); } var charList = makeOnlyCharArr(charArr); var charList2 = makeOnlyCharArr(charArr2); return charList.every((c, i) => c === charList2[i]); };
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/자바스크립트] 트리에서 잎노드 개수 구하기 (Tree Count Leaves) (484) 2019.07.23 [알고리즘/자바스크립트] 뒤집어진 연결 리스트 (Reverse Linked List) (609) 2019.07.18 [알고리즘/자바스크립트] 베스트앨범 / 프로그래머스 - 해시 Level 3 (609) 2019.07.14 [알고리즘/자바스크립트] 위장 / 프로그래머스 - 해시 Level 2 (609) 2019.07.13 [알고리즘/자바스크립트] 완주하지 못한 선수 / 프로그래머스 - 해시 Level 1 (609) 2019.07.13 COMMENT