Group Anagrams(python)

참고 자료

leetcode - Group Anagrams
파이썬 알고리즘 인터뷰

문제 설명

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"]]

Example 2:

Input: strs = [""]
Output: [[""]]

Example 3:

Input: strs = ["a"]
Output: [["a"]]

Constraints:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] consists of lower-case English letters.

나의 생각

같은 그룹의 단어는 알파벳이 같은 것을 알 수 있다.
그래서 딕셔너리를 활용해서 알파벳의 개수를 계산해서 비교하면 어떨까 생각했다.
하지만 각 딕셔너리를 어떻게 비교할지 몰라서 다른 방법을 생각했다.
그 다음 단어의 정렬을 비교해서 그룹화를 생각했다.
그룹화를 하기 위해서 딕셔너리밖에 생각이 안났고, key값을 어떻게 할지 고민했다.
그룹의 공통적인 부분이 정렬된 문자열이 같다는 것을 알고 이것을 key값으로 했다.

코드

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        d = {}
        for str in strs:
            key = "".join(sorted(str))
            if key not in d:
                d[key] = [str]
            else:
                d[key].append(str)
        return d.values()
  • defaultdict 사용.
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        anagrams = collections.defaultdict(list)
        for word in strs:
            anagrams["".join(sorted(word))].append(word)

        return anagrams.values()
  • defaultdict, key로 tuple을 사용.
class Solution(object):
    def groupAnagrams(self, strs):
        ans = collections.defaultdict(list)
        for s in strs:
            ans[tuple(sorted(s))].append(s)
        print(ans)
        return ans.values()
  • 첫번째 생각인 알파벳의 개수로 비교하는 경우.
class Solution:
    def groupAnagrams(strs):
        ans = collections.defaultdict(list)
        for s in strs:
            count = [0] * 26
            for c in s:
                count[ord(c) - ord('a')] += 1
            ans[tuple(count)].append(s)
        return ans.values()