공유오피스로 출근하는 시간 전체를 잡아먹었던, 꽤나 고민했던 코드카타. 기억에 남아, 남겨본다
다음과 같이 input이 주어졌을 때,같은 알파벳으로 이루어진 단어끼리 묶어주세요.
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
output에서 순서는 상관없습니다.
코드로 풀면 아래와 같다.
// checker 함수는 인자로 주어진 두 개의 스트링이 같은 알파벳으로 이루어졌는지 확인한다.
const checker = (str1, str2) => {
let isIdentical = true;
const src = str1.length >= str2.length ? str1 : str2;
const target = str1.length < str2.length ? str1 : str2;
for (let i = 0; i < src.length; i++) {
if (!target.includes(src[i])) {
isIdentical = false;
break;
}
}
return isIdentical;
}
// 본 함수
const groupAnagrams = strs => {
const result = [];
while (strs.length !== 0) {
const sameWords = [];
const firstWord = strs[0];
sameWords.push(firstWord)
strs.splice(0,1);
for (let i = 0; i< strs.length; i++) {
if (checker(firstWord, strs[i])) {
sameWords.push(strs[i]);
strs.splice(i,1);
i -= 1;
}
}
result.push(sameWords)
}
return result
};
내가 생각했던 것 보다 훨씬 깔끔한 풀이가 가능하다. 모범 답안의 접근은 아래와 같다.
const groupAnagrams = strs => {
const map = {};
for (let str of strs) {
const key = [...str].sort().join('');
if (!map[key]) {
map[key] = [];
}
map[key].push(str);
}
return Object.values(map);
};
와우. 해쉬 맵과 비슷한 느낌으로 풀면 좋을 것 같다라는 생각은 했지만, 정확하게 어떻게 로직을 짜야할 지 몰랐었다. 그래서 때려 맞추기 식으로 했었는데, 모범 답안을 보니, 생각보다 간단했었네.. 분발합시다.