소소한 컴퓨터 이야기

그룹 애너그램

by Cori

문제

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

 

* 애너그램이란 ? 일정의 언어유희로, 문자를 재배열하여 다른 뜻을 가진 단어로 바꾸는 것을 뜻함 

· 입출력 예 

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

풀이

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

-> 애너그램을 판단하는 가장 간단한 방법은 정렬하여 비교하는 것이다. (애너그램 관계인 단어를 정렬하면 서로 같은 값을 가짐)

def groupAnagrams(strs: list[str]) -> list[list[str]]:
    anagrams = collections.defaultdict(list)
    
    for word in strs:
        anagrams[''.join(sorted(word))].append(word)
    return list(anagrams.values())

딕셔너리는 키 값으로 문자열을 가질 수 있기 때문에, sorted 함수를 통해 입력받은 배열을 정렬후 조인 연산을 통해 문자열로 만들어 애너그램이라는 딕셔너리의 키로 사용한다. 이로써 애너그램 끼리는 같은 키를 갖게 되고, 여기에 기존 단어들을 값으로 추가하여 이를 최종적으로 리스트 형태로 반환한다.


Info

1. defaultdict(list)

-> 존재하지 않는 키를 삽입하려 할 경우 KeyError가 발생하는 것을 방지하기 위해 에러가 나지 않도록 항상 디폴트를 생성해준다. 기본값으로 리스트를 생성하기 때문에, Value 값을 추가할 때 append 함수를 사용할 수 있음 

2. anagrams[''.join(sorted(word))] 

-> 리스트를 join 함수를 이용해 문자열로 만들어, 딕셔너리의 키 값으로 사용한다. 

3. sorted(a, key = lambda s: (s[0], s[-1])

-> a = ['cde', 'cfc', 'abc']와 같은 형태로 되어 있을 때 첫 문자열과 마지막 문자열 순으로 정렬한다.

'CS > Coding Test' 카테고리의 다른 글

가장 긴 팰린드롬 부분 문자열  (0) 2021.10.01
Hashing  (0) 2021.10.01
전화번호 목록  (0) 2021.09.29
가장 흔한 단어  (0) 2021.09.29
로그 파일 재정렬  (0) 2021.09.28

블로그의 정보

코딩하는 오리

Cori

활동하기