안녕하세요. 혀코입니다.
이번 시간에는 문자열 구성 비교하는 방법에 대해서 알아보겠습니다.
function anagrams(stringA, stringB) {
let a = stringA.replace(/[^\w]/g,'').toLowerCase().split('').sort().join();
let b = stringB.replace(/[^\w]/g,'').toLowerCase().split('').sort().join();
return a === b;
}
module.exports = anagrams;
문자열에 replace 메소드를 써서 regular expression(/[^\w]/g,'')을 적용하면, 기호와 스페이스를 제거해줍니다. 여기에 toLowerCase() 메소드를 적용하면 모든 문자를 소문자 형식으로 바꿔주고, split() 메소드를 사용하면, 문자열을 배열(array)로 만들어줍니다. sort() 메소드를 사용하면, 배열을 오름차순으로 정렬하게 되고, join() 메소드를 사용하면 배열을 하나의 문자열로 만들어 줍니다. 이렇게 변환된 문자열을 a, b에 저장하고 서로를 비교해서 동일하다면, true를 리턴하게 되고, 다르다면, false를 리턴하게 됩니다.
이번에는 sort() 메소드를 사용하지 않고 map을 사용해서 문자열 구성을 비교하는 방법입니다.
function anagrams(stringA, stringB) {
const aCharMap = buildCharMap(stringA);
const bCharMap = buildCharMap(stringB);
if(Object.keys(aCharMap).length !== Object.keys(bCharMap).length) {
return false;
}
for(let char in aCharMap) {
if(aCharMap[char] !== bCharMap[char]) {
return false;
}
}
return true;
}
function buildCharMap(str) {
const charMap = {};
for(let char of str.replace(/[^\w]/g).toLowerCase()) {
charMap[char] = charMap[char] + 1 || 1;
}
return charMap;
}
module.exports = anagrams;
문자열을 받아서 map으로 변환하는 buildCharMap 함수를 만들었습니다. 비어있는 map 데이터를 하나만들어 놓고, 문자열에 기호와 스페이스를 제거하고 소문자로 치환한다음 for of loop을 이용해서 문자 하나하나를 돌립니다. Hello의 경우 {h: 1, e: 1, l: 2, o: 1} 이 됩니다.
anagrams 함수에서는 이렇게 변환된 map을 가지고 key 값의 길이를 확인해서 두개의 문자열이 동일한 길이를 가지는지 확인해서 다르다면 false를 리턴합니다. 또, map을 for in loop으로 돌려서 동일한 key값에 동일한 value를 가지고 있는지 확인해서 다르다면, false를 리턴합니다. 최종적으로 다른점이 없다면, true를 리턴하게 됩니다.
이렇게 문자열 구성 비교하는 방법에 대해서 알아봤습니다.
유용하셨다면, 공감과 구독 부탁 드립니다.
감사합니다.
댓글