
단어를 이루고 있는 문자를 재배열해서 새로운 단어를 만드는 것을 애너그램이라고 하는데, 입력된 Array<String>의 원소들을 애너그램단위로 그룹화 하는 문제이다.
(즉, 같은 문자로만 이루어진 단어들을 그룹으로 만드는 문제)
class Solution {
fun groupAnagrams(strs: Array<String>): List<List<String>> {
var result = mutableMapOf<String, List<String>>()
for (i in strs) {
val key = i.toCharArray().sorted().joinToString("")
val value = result.getOrDefault(key, mutableListOf())
result[key] = value.plus(i)
}
return result.values.sortedBy { it.size }
}
}
각 단어의 문자를 정렬해 key값을 만들어 같은 문자로만 이루어진 원소들을 그룹핑했다.
Kotlin에는 연산자 map{}이 있는데 컬렉션인 Map도 있어서 정말 헷갈린다.
getOrDefault()는 컬렉션 Map의 확장 함수이다. Map의 경우 기존의 컬렉션과 같이 get()메서드나 name[key]방식을 사용해 컬렉션의 원소에 접근이 가능하지만, Array나 List와는 다르게 index가 아닌 임의의 key값을 통해 원소에 접근하기 때문에 해당 key에 대한 value가 없는 경우가 생길 수 있다.
가령 다음과 같은 mapA가 있을 때 mapA["e"]와 같이 존재하지 않는 key값의 원소를 불러올 경우 값이 없어 에러가 생긴다.
val mapA = ["a" = 2, "b"= 3, "c" = 4]
그런 일을 방지하기위해 getOrDefault()를 사용하는데, getOrDefault()는 매개변수로 key값과 default value를 전달받아 우선적으로 key값에 해당하는 원소가 존재하는지 확인한다.
만약 원소가 존재할경우 해당 원소의 value를 존재하지 않을 경우 입력한 default value를 반환한다
쉽게 생각하자면 mapA["e"] ?: 0과 같다고 볼 수 있다.