애너그램이란 글자의 나열 순서는 다르지만 구성은 일치하는 문자를 뜻한다.
1 split으로 문자열을 쪼개어 배열로 만들고
2 sort로 배열을 정렬한 뒤
3 join으로 다시 문자열로 변환시켜준다.
const stringA = listen;
const stringB = silent;
function isAnagram(strA, strB) {
if(strA.length !== strB.length) {
return false;
}//문자열의 길이가 다르면 바로 아웃
return strA.split("").sort().join() === strB.split("").sort.join();
}
console.log(isAnagram(stringA, stringB)); //true
문자를 key로, 출연빈도를 값으로 저장
const strA = "listent";
const strB = "silentt";
function isAnagram(strA, strB) {
if (strA.length !== strB.length) {
return false;
}
const hashMap = {};
for (const char of strA) {
hashMap[char] = hashMap[char] ? hashMap[char] + 1 : 1;
//{ hashMap: { l: 1, i: 1, s: 1, t: 2, e: 1, n: 1 } }
}
for (const char of strB) {
if (!hashMap[char]) {
return false;
}
hashMap[char]--;
//같은 글자를 찾으면 개수 줄이기
//없으면 listent,silents에서 오류 발생
}
return true;
}
isAnagram(strA, strB);
JS에서 해시테이블은 대표적으로 Object, Map, Set이 있다. JS에서 key-value로 이루어진 자료구조는 Object가 대표적이였지만, ES6에서 Map과 Set이 추가되었다.
2.1 Map 객체란?
주로 Object와 비교됨
key-value로 이루어진 해시 테이블
탐색은 get(), 삽입은 set()으로 한다.
key는 고유값으로써, 단 한개만 존재한다.
key 가능 자료형 : number, string, function, object, NaN
2.2 Map의 함수들
2.2.1 value 설정 : set()
let map = new Map();
let number = 0;
let str = 'string';
let obj = { a: 1 };
let fnc = () => {
console.log('fnc');
};
map.set(number, 4); //key에 number 가능
map.set(str, 1); // key에 string 가능
map.set(obj, 2); //key에 object 가능
map.set(fnc, 3); // key에 함수 가능
map.set(number, 0); // 덮어쓰기 가능
console.log(map); // Map(4) {0 => 0, "string" => 1, {…} => 2, ƒ => 3}
2.2.2 value 얻기 : get()
map.get(str); // 1
map.get(obj); // 2
map.get('none'); // undefined
map.get({ a: 1 }); // undefined, obj !== { a: 1 }
2.2.3 value 찾기 : has()
map.has(str); // true
map.has(obj); // true
map.has('none'); // false
2.2.4 value 삭제 : delete()
map.delete(str); // true
2.2.5 value 존재유무 : size
map.size // 4
map.length // undefined
2.2.6 hash 탐색 : for-of 문
//key, value 쌍으로 출력
for (let [key, value] of map) {
console.log(key + ' = ' + value)
}
//key만 출력
for (let key of map.keys()) {
console.log(key)
}
//value만 출력
for (let value of map.values()) {
console.log(value)
}