https://school.programmers.co.kr/learn/courses/30/lessons/120812
class Solution {
fun solution(array: IntArray): Int = array
.groupBy{it}
.map{it.value.size to it.key}
.sortedByDescending { it.first }
.let {
if(it.size > 1 && it[0].first == it[1].first) -1 else it.first().second
}
}
첫 번째 입출력 예를 통해 코드의 출력값을 흐름에 따라 알아보자. [1, 2, 3, 3, 3, 4]
우선 array를 가져와서 groupBy{ it } 으로 묶어준다.
groupBy 함수는 Map<K, List<V>> 형태의 결과를 반환한다.
즉, 키와 키에 해당하는 요소들을 리스트로 묶은 맵을 반환한다.
여기서는 it 자체로 키의 형태로 묶었기에 1,2,3,4를 키 형태로 가지고 그 키에 해당하는 원소들을 리스트에 넣는다.
{1=[1], 2=[2], 3=[3, 3, 3], 4=[4]} |
이런 형태로 출력된다.
이후 .map을 통해 각 맵 컬렉션에 접근을 하고 우리는 지금 가장 많이 나온 value의 크기값을 알고 싶은 것이기에
it.value.size와 it.key를 to 를 통해 Pairing 시켜준다.
여기서 it.value.size 는 3을 예로 들자면 value인 3의 갯수이다. 그리고 key는 3이 될 것이다.
[(1, 1), (1, 2), (3, 3), (1, 4)] |
이런 형태로 출력된다.
마찬가지로 우리는 가장 많이 나온 값에 관심이 있기에 it.value.size의 크기를 내림차순으로 해주기 위해
.sortedByDescending { it.first } 을 이용한다. 여기서 it.first는 방금 전 pair로 묶어준 value.size다.
[(3, 3), (1, 1), (1, 2), (1, 4)] |
이런 형태로 출력된다.
.let {
if(it.size > 1 && it[0].first == it[1].first) -1 else it.first().second
}
이후 배열의 크기가 1 이상이면서 배열 0번째와 1번째의 first 즉 최빈값이 같다면 -1 을 내보내고 그 외에는 첫번째 배열의 second 즉 키 값을 내보낸다.
'Code KATA' 카테고리의 다른 글
Programmers 공원 산책 with Kotlin (0) | 2023.12.29 |
---|---|
Programmers 달리기 경주 with Kotlin (0) | 2023.12.28 |
Programmers 개인정보 수집 유효기간 with Kotlin (0) | 2023.12.27 |
Programmers 바탕화면 정리 with Kotlin (0) | 2023.12.22 |
Programmers 성격 유형 검사하기(2022KaKaoTech) with Kotlin (1) | 2023.12.21 |