프로그래밍/[ Python ]

[문자열 조작] 그룹 애너그램

망나 2021. 1. 11. 14:07

* leetcode 49. Group Anagrams

 

Q. 문자열 배열을 받아 애너그램 단위로 그룹핑하라.

# 입력
["eat", "tea", "tan", "ate", "nat", "bat"]

# 출력
[
  ["ate", "eat", "tea"],
  ["nat", "tan"],
  ["bat"]
]

 

풀이 1. 정렬하여 딕셔너리에 추가

def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
    # defaultdict를 사용하면 항상 디폴트 키를 생성해주기 때문에 KetError를 피할 수 있다.
    anagrams = collections.defaultdict(list)
    
    for word in strs:
        # sorted로 정렬한 문자열을 키값으로 사용하기 위해 join을 사용하여 합쳐준다.
        # sorted("eat") = ['a', 'e', 't']
        # ''.join(sorted("eat")) = ['aet']
        anagrams[''.join(sorted(word))].append(word)
    
    return anagrams.values()

 

Python 정렬 방법

"""sorted()"""
# 기본 정렬
a = [2, 5, 1, 9, 7]
sorted(a)
-> [1, 2, 5, 7, 9]

# key 옵션을 사용한 정렬
c = ['ccc', 'aaaa', 'd', 'bb']
sorted(c, key=len) # key옵션에 별도 키 또는 함수를 지정할 수 있다.
-> ['d', 'bb', 'ccc', 'aaaa']


a = ['cde', 'cfc', 'abc']
def fn(s):
    return s[0], s[-1]
sorted(a, key=fn) # 함수 fn을 활용해 첫 문자열(s[0])과 마지막 문자열(s[-1]) 순으로 정렬하도록 지정
-> ['abc', 'cfc', 'cde']

sorted(a, key=lambda s: (s[0], s[-1])) # lambda 표현식으로 한줄로 표현 가능하다.


"""sort()"""
a.sort() # sort()는 리스트 자체를 제자리 정렬한다.
a = a.sort() # sort()는 None을 반환하므로 잘못된 구문.