각각의 단어의 이루어진 철자가 같으면 그 단어들을
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
};
이번 문제는 접근을 정확히 하지 못한다면 많이 돌아갈 것이라는 생각을 했다. 그렇기에 처음에는 단순히 반복분만을 이용해 글자를 하나하나 뜯어보면서 비교해보았다. 그럴 경우, 이루어지는 글자가 같지만 그 글자를 포함하고 더 많은 글자가 형성된 단어들이랑도 비교 결과가 같다고 이루어지기에, 정렬을 통해 정렬후에도 단어가 일치할 경우로 비교를 하는게 훨씬 수월하다고 생각하여 코드를 바꿔서 풀었다. 그 결과 더 수월하게 문제 풀이를 진행할 수 있었다.