React

49. Group Anagrams

Medium
Given an array of strings strs, group the anagrams together. You can return the answer in any order.
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
Example 1:
Input: strs = ["eat","tea","tan","ate","nat","bat"] Output: [["bat"],["nat","tan"],["ate","eat","tea"]]
Plain Text
복사
Example 2:
Input: strs = [""] Output: [[""]]
Plain Text
복사
Example 3:
Input: strs = ["a"] Output: [["a"]]
Plain Text
복사
Constraints:
1 <= strs.length <= 10410^{4}
0 <= strs[i].length <= 100
strs[i] consists of lowercase English letters.

My solution

An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once. 다른 단어나 구의 글자를 재배치하여 형성된 단어나 구이며, 일반적으로 모든 원래 글자를 정확히 한 번 사용합니다.
Input: strs = ["eat","tea","tan","ate","nat","bat"] Output: [["bat"],["nat","tan"],["ate","eat","tea"]]
우연히 차례대로 들어온 것이지 순서는 관계 없다.
각각이 어떻게 애너그램으로 묶이는지를 확인해야 한다.
애들이 가지고 있는 문자 하나하나를 Set에 담는다. 이 Set끼리 서로 비교한다. 하나가 가진 모든 키를 가지고 for문으로 순회하면서 Set에 접근해서 모두 같은 프로퍼티 값을 가졌는지 확인한다. 만약 모두 같은 값이라면 true가 나올 것이고 배열에 추가한다.

Map Object에 담아서 비교해야 하는데 Object.values를 가져오면 값들이 [ ['a', 1],,,]로 나옴 Object.fromEntries()에 Map을 넣으니 객체 형식이 됨

test('TC4', () => { expect(groupAnagrams(['', 'b'])).toStrictEqual([['b'], ['']]); }); test('TC5', () => { expect(groupAnagrams(['', ''])).toStrictEqual([['', '']]); });
JavaScript
복사
위의 테케는 통과되지 않았다. 객체에 빈 문자열을 키로 넣을 수 없기 때문이었다. 아무리 객체에 넣으려고 해도 방법이 없었다. 그래서 아예 다른 방법을 찾아야 했다.
다른 사람의 풀이를 보고 굉장히 깔끔한 풀이라고 생각해서 참고했다.
const key = strs[i].split('').sort().join(''); console.log(key);
JavaScript
복사
문자열의 배열을 하나씩 꺼내서 이 문자열을 나눠서 sort한 다음 이었다. 이렇게 만들어진 문자열은 애너그램인지 알 수 있었다.
객체에 이 키에 맞춰 배열을 구성했다. 배열에는 실제 문자열을 넣었다. 나중에 만든 배열들의 배열을 리턴하면 답이 나온다.
if (res[key]) { res[key].push(strs[i]); } else { res[key] = [strs[i]]; }
JavaScript
복사

소스코드

/** * @param {string[]} strs * @return {string[][]} */ const groupAnagrams = function (strs) { const res = {}; for (let i = 0; i < strs.length; i++) { const key = strs[i].split('').sort().join(''); if (res[key]) { res[key].push(strs[i]); } else { res[key] = [strs[i]]; } console.log(res); } return Object.values(res); }; test('TC1', () => { expect(groupAnagrams(['eat', 'tea', 'tan', 'ate', 'nat', 'bat'])).toStrictEqual([ ['bat'], ['nat', 'tan'], ['ate', 'eat', 'tea'], ]); }); // test('TC2', () => { // expect(groupAnagrams([''])).toStrictEqual([['']]); // }); // test('TC3', () => { // expect(groupAnagrams(['a'])).toStrictEqual([['a']]); // }); // test('TC4', () => { // expect(groupAnagrams(['', 'b'])).toStrictEqual([['b'], ['']]); // }); test('TC5', () => { expect(groupAnagrams(['', ''])).toStrictEqual([['', '']]); });
JavaScript
복사