각각의 단어의 이루어진 철자가 같으면 그 단어들을 grouping해주는 문제이다. 문제에 대한 접근은 우선 모든 단어를 sort()를 통해 정렬해주면 이루어지는 철자가 같다면 같은 단어가 형성되기 때문에 그러한 집단을 객체를 통해 grouping해주어 배열을 추출해주는 식으로 접근을 해보았다.
const groupAnagrams = strs => {
let sortedArr=[]
// strs의 요소들을 정렬해준 배열
let newDictionary = {}
// 중첩되는 요소들을 key로 받는 객체, value는 글자가 같은 단어들
let returnArr=[]
// 최종적 반환하는 배열, 마지막에 객체의 value들을 push해줌으로써 요소 형성
for (let i=0; i<strs.length; i++)
{
sortedArr.push(strs[i].split('').sort())
// 각 요소들을 글자단위로 쪼개서 정렬후 push
}
for (let i=0; i<sortedArr.length; i++)
{
// newDictionary의 해당 키값이 undefined일 경우,
// sortedArr[i].join('')은 떨어진 글자를 단어로 합쳐줌
if (!newDictionary[sortedArr[i].join('')])
{
// 해당 객체의 밸류를 빈 배열로 선언후, 그 배열안에 해당 단어 push
newDictionary[sortedArr[i].join('')]=[]
newDictionary[sortedArr[i].join('')].push(strs[i])
}
// 이미 해당 객체 요소의 값이 선언되있는 경우(이전에 이미 만들어짐)
else
{
newDictionary[sortedArr[i].join('')].push(strs[i])
}
}
for (let key in newDictionary)
{
returnArr.push(newDictionary[key])
}
return returnArr
};
이번 문제는 접근을 정확히 하지 못한다면 많이 돌아갈 것이라는 생각을 했다. 그렇기에 처음에는 단순히 반복분만을 이용해 글자를 하나하나 뜯어보면서 비교해보았다. 그럴 경우, 이루어지는 글자가 같지만 그 글자를 포함하고 더 많은 글자가 형성된 단어들이랑도 비교 결과가 같다고 이루어지기에, 정렬을 통해 정렬후에도 단어가 일치할 경우로 비교를 하는게 훨씬 수월하다고 생각하여 코드를 바꿔서 풀었다. 그 결과 더 수월하게 문제 풀이를 진행할 수 있었다.