본문 바로가기
LeetCode/Array & Hashing

[LeetCode][Kotlin] 49. Group Anagrams

by jinwo_o 2024. 8. 13.

49. Group Anagrams

Given an array of strings strs, group the anagrams together. You can return the answer in any order.

문자열 strs 배열이 주어지면, 애너그램을 그룹화합니다. 어떤 순서로든 답을 반환할 수 있습니다.

 

Example 1:

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

Output: [["bat"],["nat","tan"],["ate","eat","tea"]]

Explanation:

  • There is no string in strs that can be rearranged to form "bat".
  • The strings "nat" and "tan" are anagrams as they can be rearranged to form each other.
  • The strings "ate", "eat", and "tea" are anagrams as they can be rearranged to form each other.

Example 2:

Input: strs = [""]

Output: [[""]]

 

Example 3:

Input: strs = ["a"]

Output: [["a"]]


코드 1

  • 문자열을 정렬된 리스트로 전환한 후 그룹화하기
class Solution {
    fun groupAnagrams(strs: Array<String>): List<List<String>> {
        return strs.groupBy { it.toList().sorted() }
            .values
            .toList()
    }
}

 

코드 2

  • groupingBy 와 eachCount 함수를 이용해서 문자열의 요소 수를 키로 매핑하기
class Solution {
    fun groupAnagrams(strs: Array<String>): List<List<String>> {
        return strs.groupBy { str -> str.groupingBy { it }.eachCount() }
            .values
            .toList()
}

 

코드 3

  • 문자열의 요소 수를 확인하기 위해 아스키코드 값을 활용한다.
  • 문자열의 전체 요소 수를 담은 배열을 문자열로 변환하고, 해당 문자열을 기준으로 아나그램을 그룹화한다.
class Solution {
    fun groupAnagrams3(strs: Array<String>): List<List<String>> {
        val answer = HashMap<String, MutableList<String>>()

        for (s in strs) {
            val count = IntArray(26)

            for (c in s) {
                count[c - 'a'] += 1
            }

            val key = count.joinToString()
            if (key !in answer) {
                answer[key] = mutableListOf<String>()
            }
            answer[key]!!.add(s)
        }

        return answer.values.toList()
    }
}