티스토리 뷰
문자열 배열을 받아 애너그램 단위로 그룹핑
def anagramsGroup(words)-> List(List(str):
anagrams = collections.defaultdict(list)
for word in words:
anagrams[''.join(sorted(word))].append(word)
return angrams.values()
if __name__ == "__main__":
words = ["price", "ceipr", "cpire", "criep", "creep", "preec", "low",
"wol", "wwws", "swss", "brian"]
anagrams(words)
코드가 짧다. 그 만큼 함수를 충분히 이해하고 잘 알고 있어야 한다.
하나씩 천천히 살펴보겠다.
anagrams_dict = collections.defaultdict(list)
본래 딕셔너리는 key값을 부여하여 삽입을 하는 경우 key값이 존재하는 않으면 KeyError가 발생한다.
해당 함수는 key값이 존재하지 않아도 default 키를 넣거나 들어온 데이터를 key로 생성한다.
for word in words:
print(sorted(word))
# >> ['c', 'e', 'i', 'p', 'r'], ['l', 'o', 'w']
print(''.join(sorted(word)))
# ceipr, ceepr, low , swww
print(anagrams_dict[''.join(sorted(word))])
# >> [] 키에 맞는 리스트가 비어있다.
# anagrams_dict = {
# 'ceipr' : [append되는 word]
# }
anagrams_dict[''.join(sorted(word))].append(word)
return angrams.value()
# sorted(word) >> word = price >>
['c', 'e', 'i', 'p', 'r']
sorted() : 들어오는 문자열을 문자 하나로 나누어 순위에 맞는 정렬을 진행한뒤 '리스트' 로 return 한다.
#join()
''.join(sorted(word)) #word = price
>>ceipr
join() 함수는 리스트를 값으로 받아온다. 받아온 리스트의 문자를 모두 합친다.
만약 join 함수 앞에 특정 조건이 있다면 ex ) '_'.join() ==> a_b_c 처럼 각각의 문자 사이에 조건이 들어가게 된다.
아무것도 넣지 않고자 한다면 ''을 사용하면 된다.
#딕셔너리['키값']
anagrams_dict[''.join(sorted(word))]
print(anagrams_dict[''.join(sorted(word))])
>> # anagrams_dict = {
# 'ceipr' : [append되는 word]
# }
anagrams_dict[''.join(sorted(word))].append(word)
그렇게 만들어진 문자열을 딕셔너리의 키로 사용한다. 딕셔너리에 키가 없다면 넣고자 하는 키를 알아서 생성한다.
위의 코드는 현재 '딕셔너리 키' 를 다루는 코드이다. 해당 키의 value 값에 리스트의 값을 넣기 위해 리스트 append를 사용하여 현재 for문을 돌고 있는 단어를 추가한다.
'알고리즘' 카테고리의 다른 글
dfs - 섬의 개수(number of islands) (0) | 2022.01.21 |
---|---|
DFS (GRAPH) (0) | 2022.01.21 |
스택, 큐 (0) | 2022.01.18 |
연결리스트 / (문제) 팰린드롬 연결리스트 (0) | 2022.01.17 |
주식을 사고팔기 가장 좋은 시점 (0) | 2022.01.17 |