카테고리 없음

Anagram grouping

codermun 2021. 3. 4. 19:00
728x90
반응형

 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
반응형