-
Anagram grouping카테고리 없음 2021. 3. 4. 19:00728x90
Anagram
Anagram은 일반적으로 모든 원본 문자를 정확히 한 번 사용하여
다른 단어 나 구의 문자를 재배열하여 형성 된 단어 또는 문구이다.
Example 1: Input: strs = ["eat","tea","tan","ate","nat","bat"] Output: [["bat"],["nat","tan"],["ate","eat","tea"]] Example 2: Input: strs = [""] Output: [[""]] Example 3: Input: strs = ["a"] Output: [["a"]] Constraints: 1 <= strs.length <= 104 0 <= strs[i].length <= 100 strs[i] consists of lower-case English letters.
키포인트
애너그램의 문제의 핵심은 정렬하여 비교하는 것인데,
두 문자열이 애너그램이라면 sorted 함수의 인자로 줬을 때 결국 같은 값이 나오게 된다. (핵심)
def are_anagrams(a, b): return sorted(a) == sorted(b) print(are_anagrams('listen', 'silent')) print(are_anagrams('pop', 'odd')) True False
또한, 목적은 같은 애너그램끼리 묶는다는 것을 인지하고 풀도록하자.
도중에 딴길로 세서 뻘짓을 많이하였다.
먼저, strs에서 하나의 요소를 가져와 그 요소를 정렬한다.
정렬 한 요소를 키 값을 기준으로 동일한 인수(여기선 동일한 문자열)을 리스트로 묶어 딕셔너리에 추가해준다.
({"A" : ['abc', 'bac', 'cab'], "B" : ['qw', 'wq']} 형식이다)
후에 값에 해당하는 값만을 리턴해주면 된다.
Input: strs = ["eat","tea","tan","ate","nat","bat"] Output: [["bat"],["nat","tan"],["ate","eat","tea"]] class Solution: def groupAnagrams(self, strs: List[str]) -> List[List[str]]: my_dict = {} for char in strs: key = ''.join(sorted(char)) if key not in my_dict: my_dict[key] = [char] else: my_dict[key] += [char] return my_dict.values() # [["eat","tea","ate"],["tan","nat"],["bat"]] print(my_dict) # {'aet': ['eat', 'tea', 'ate'], 'ant': ['tan', 'nat'], 'abt': ['bat']}
시간복잡도
for문 O(n)
정렬! O(n log n)
전형적인 쓸만한 정렬 알고리즘의 속도를 확인 할 수 있었다.
728x90