두 문자열이 주어질 때, 두 문자열에 대해 서로 애너그램일 경우 true, 아닐경우 false 를 반환하는 코드를 작성하라.
즉 문자의 순서는 다를 수 있으나 각 문자의 수는 동일해야 하며 문자의 길이 또한 동일해야 한다.
function validAnagram(str1, str2) {
// 두 문자열의 길이가 같은지 검토. 다르다면 false 반환
if (str1.length !== str2.length) {
return false;
}
if (str1 === str2) return true;
// 두 문자열의 비교하기 위한 객체 생성
let frequencyCounter1 = {};
let frequencyCounter2 = {};
// str1 의 각 문자 수 세기
for (let val of str1) {
frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1;
}
console.log(frequencyCounter1)
// str2 의 각 문자 수 세기
for (let val of str2) {
frequencyCounter2[val] = (frequencyCounter2[val] || 0) + 1;
}
// 생성한 두 객체의 키가 같은지 비교
for (let key in frequencyCounter1) {
if (!(key in frequencyCounter2)) {
return false;
}
if (frequencyCounter2[key] !== frequencyCounter1[key]) {
return false;
}
}
// 위 모든 과정에 옳다면 true 반환
return true;
}
validAnagram('anagram', 'nagaram')
function validAnagram(first, second) {
if (first.length !== second.length) {
return false;
}
const lookup = {};
for (let i = 0; i < first.length; i++) {
let letter = first[i];
// if letter exists, increment, otherwise set to 1
lookup[letter] ? (lookup[letter] += 1) : (lookup[letter] = 1);
}
for (let i = 0; i < second.length; i++) {
let letter = second[i];
// can't find letter or letter is zero then it's not an anagram
if (!lookup[letter]) {
return false;
} else {
lookup[letter] -= 1;
}
}
return true;
}