validAnagram 문제풀이
내 풀이
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)을 사용하여 배열의 값을 비교했다.
배열 값 비교 js에서 어떤거 써야됨?
결과:
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;
}
- letter 객체에 해당 스트링을 key, 갯수를 value로 입력한다.
- 두 번째 스트링을 for문을 돌면서 letter객체에서 해당 스트링의 개수를 하나씩 빼주면서 0이되거나 존재하지 않는 스트링일 때 false를 리턴한다.
- 중첩 루프가 아닌 두개의 for문으로 간단하게 해결했다.
- 나는 내 풀이가 더 좋다.
Author And Source
이 문제에 관하여(validAnagram 문제풀이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@stthunderl/validAnagram-알고리즘저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)