내 풀이
function validAnagram(str, str2) {
// 접근
// 1. 두 스트링을 모두 아스키 코드로 바꿔서 두 배열에 각각 담는다.
// 2. 두 배열을 sort시킨다.
// 3. 두 배열을 비교한다.
var map = Array.prototype.map;
var a = map.call(str, function(x) {
return x.charCodeAt(0);
});
var b = map.call(str2, function(x){
return x.charCodeAt(0);
})
a.sort();
b.sort();
return JSON.stringify(a)===JSON.stringify(b);
}
console.log(validAnagram('','')); // true
console.log(validAnagram('aaz','zza')); // false
console.log(validAnagram('anagram','nagaram')); // true
console.log(validAnagram('rat','car')); // false
console.log(validAnagram('awesome','awesom')); // false
console.log(validAnagram('qwerty','qeywrt')); // true
console.log(validAnagram('texttwisttime','timetwisttext')); // true
일단 간단하게 풀어봤다.
String에 map을 사용해서 각 문자의 ASCII 인코딩 값을 요소로 갖는 배열을 얻는 방법을 사용했다
var map = Array.prototype.map;
var a = map.call(str, function(x) {
return x.charCodeAt(0);
});
Array.prototype.map.call 을 사용하면, Array, NodeList, Str에 map 을 사용할 수 있다.
이후에는 sort를 사용하여 정렬을 한뒤, JSON.stringify(a)===JSON.stringify(b)을 사용하여 배열의 값을 비교했다.
결과:
O(N)으로 풀이에 성공하긴 했지만, Best Practice 인지는 조금 더 생각해봐야겠다.
다른 풀이
function validAnagram_(first, second) {
if (first.length !== second.length) {
return false;
}
const letter = {};
for (let i = 0; i < first.length; i++) {
if (!letter[first[i]]) {
letter[first[i]] = 1;
} else {
letter[first[i]] += 1;
}
}
for (let i = 0; i < second.length; i++) {
if (!letter[second[i]]) {
return false;
} else {
letter[second[i]] -= 1;
}
}
return true;
}