[Leetcode/Medium] 그룹 애너그램 (49. Group Anagrams, Swift)

2024. 6. 30. 10:12Algorithm

https://leetcode.com/problems/group-anagrams/description/

 

🤔 문제 설명

문자열 배열이 주어지면, 애너그램 단위로 그룹화하세요.

애너그램(Anagram)이란 다른 단어나 구문의 글자를 재정렬하여 다른 뜻을 가진 단어로 바꾸는 것을 뜻합니다.
(예시: '문전박대' -> '대박전문')

strs = ["eat","tea","tan","ate","nat","bat"]
// [["bat"],["nat","tan"],["ate","eat","tea"]]

 

💡 풀이

입력으로 들어온 String Array를 반복하면서 해당 단어랑 같은 애너그램 단위로 그룹화할 수 있는 단어를 찾는 것이 이 문제의 핵심이었다.

이때 단어를 sorted해주게 되면, 같은 애너그램 단위에서 나올 수 있는 단어가 같아 Key 값으로 처리해줄 수 있을 것이라 생각했고,
그 Key값에 대해 같은 애너그램 단위로 딕셔너리 Value를 Array를 묶어 판별해줄 수 있었다.

반복이 끝났을 때, 해당 딕셔너리에 대해 value값만 return하면 최종적으로 원하는 값을 꺼낼 수 있었다!

 

🧑🏻‍💻 코드 (Swift ver.)

class Solution {
    func groupAnagrams(_ strs: [String]) -> [[String]] {
        var anagrams = [String: [String]]()         // Anagram을 판단하기 위한 딕셔너리 
        
        for str in strs {
            let sortedStr = String(str.sorted())    // 정렬된 단어를 Key값으로 가짐 -> 애너그램 단어는 정렬해도 단어가 같음

            if var anagram = anagrams[sortedStr] {  // 딕셔너리에 key 값이 있는 경우 -> 기존 Value에 append한 후, 갈아 끼우기
                anagram.append(str)
                anagrams[sortedStr] = anagram
            } else {                                // 딕셔너리에 key 값이 없는 경우 -> Key 값에 해당하는 새로운 Array 추가
                anagrams[sortedStr] = [str]
            }
        }
        
        return Array(anagrams.values)
    }
}