- 파이썬 알고리즘 인터뷰 5번 문제
- 문자열 배열을 받아 애너그램 단위로 그룹핑하라.
⊙ 애너그램: 문자를 재배열하여 다른 뜻을 가진 단어로 바꾸는 것.
⊙ 예를 들어서 '문전박대'를 재배열하여 '대박전문'으로 바꾸는 것이 있다.
2020.01.16
1 try
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
words = defaultdict(list)
result = []
for x in strs:
words["".join(sorted(list(x)))].append(x)
for x in words:
result.append(words[x])
for y in result:
y.sort()
return result
- 입력받은 list의 각 문자열을 일단 알파벳순으로 정렬한다. (예시:"cab" → "abc")
- 정렬한 문자열을 키 값으로 가지고, 원래의 문자열을 value로 갖는 dict를 만든다.
- 나는 문자열을 먼저 정렬하기 위해 sorted(list(x))를 해주었다.
- 그리고 list를 문자열로 바꾸기 위해 "".join(sorted(list(x)))를 이용했다.
- 그 후 이를 2차원 배열로 반환하기 위해 result list를 생성하여 담는다.
- 출력 형태에서 각 애너그램들이 순서대로 정렬되어 있으므로 정렬해주고 result를 return한다.
1. str.join(iterable) -> str
- Concatenate(연결) any number of strings.
- The result is returned as a new string.
- join함수는 리스트의 문자열들을 합치는 역할을 한다.
- 이어줄 문자 사이에 넣어줄 특정 문자열을 제공할 수 있다.
이때는 list의 각 원소 사이에 특정 문자열이 삽입된 형태의 문자열을 반환한다.
>>> Example: '.'.join(['ab', 'pq', 'rs'])
ab.pq.rs
- 굳이 출력할 때 위의 방법처럼 정렬해서 출력할 필요는 없었다..^^
- 그냥 같은 애너그램 단위끼리 list로 묶여 있는 2차원 배열을 제대로 출력하기만 하면 됐다..
- 즉 위의 코드에서 굳이 result로 다시 옮기고 sort() 할 이유가 없었다는 뜻~
from collections import defaultdict
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
words = defaultdict(list)
for x in strs:
words["".join(sorted(x))].append(x)
return words.values()
✔ sorted(문자열)
- sorted()가 문자열도 정렬할 수 있음을 알게 되었다.
✔ dict의 .values() 함수
- values()는 dict의 value를 dict_values 타입으로 반환한다. (반환타입 list 아님!)
---------------------------------------------------------------------------
ex) print(words.values())
dict_values([['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']])
---------------------------------------------------------------------------
- list로 얻고 싶으면 list(words.values())처럼 형변환이 필요하다.
- dict의 .keys() 함수도 마찬가지로 dict_keys 타입으로 묶인 키 값들을 반환한다.
😎
sort() & sorted()
- 참고로
sorted()
와sort()
는 차이가 있다.sort
의 경우list.sort()
를 사용하고sorted
의 경우sorted(iterable)
를 사용한다.
list.sort()
- list.sort() 는 리스트 내부에서 정렬된다. sort()는 원본 리스트 자체의 순서를 변경한다. list.sort()은 return 값이 없다(⚠주의⚠)
sorted(iterable)
- 반면 sorted() 는 정렬된 새로운 리스트를 반환한다. 따라서 원본 리스트에는 영향이 가지 않는다. 즉, 반환 값으로 정렬된 결과를 얻고 싶다면 sorted() 를 사용하면 된다. 리스트, 튜플, 딕셔너리, 문자열 등 모든 iterable에 동작한다.
+ 참고: sorted()는 문자열에도 사용할 수 있다(sort()는 list만 가능)
>> print(sorted("eunseo")) ['e', 'e', 'n', 'o', 's', 'u'] >> print("eunseo".sort()) ERROR