https://school.programmers.co.kr/learn/courses/30/lessons/120812

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

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 즉 키 값을 내보낸다.

+ Recent posts