05. Group Anagrams

eunseo kim 👩‍💻·2021년 1월 16일
0

🎯 leetcode - 49. Group Anagrams


🤔 나의 풀이

📌 문제

- 파이썬 알고리즘 인터뷰 5번 문제
- 문자열 배열을 받아 애너그램 단위로 그룹핑하라.
⊙ 애너그램: 문자를 재배열하여 다른 뜻을 가진 단어로 바꾸는 것.
⊙ 예를 들어서 '문전박대'를 재배열하여 '대박전문'으로 바꾸는 것이 있다.

📌 날짜

2020.01.16

📌 시도 횟수

1 try

💡 Code

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

profile
열심히💨 (알고리즘 블로그)

0개의 댓글