티스토리 뷰

코드카타

 

귤 고르기

 

문제

 

k개의 귤을 모으기 위해 선택해야 하는 최소 그룹 수를 계산하는 문제이다.

 

 

입출력 예시

 

이걸 보자마자 같은 숫자끼리 그룹화를 해야겠다는 생각이 들었다.

 

 

풀이

class Solution {
    fun solution(k: Int, tangerine: IntArray): Int {
        // 귤의 크기에 따라 그룹화를 진행
        var tanMap = tangerine.groupBy { it } 
        
        // 각 그룹의 크기를 배열에 추출
        val arr = tanMap.entries.flatMap { listOf(it.value.size) }

        var res = 0 // 선택된 그룹의 수
        var sum = 0 // 선택된 귤의 누적 합계
        
        // 내림차순으로 정렬한 배열 순회
        for (i in arr.sortedDescending()) {
            sum += i // 현재 그룹의 크기를 누적 합계에 추가
            res += 1 // 그룹을 하나 선택했으므로 결과값 증가
            if (sum >= k) break // 누적 합계가 k 이상이면 반복문 종료
        }

        return res // 최소 그룹 수 반환
    }
}

arr을 내림차순하여 같은 크기의 귤이 많은 그룹부터 순회하도록 한다.

 

 

groupBy 함수

fun main() {
    val group = listOf(1, 2, 2, 3, 3, 3).groupBy{ it }
    println(group) // {1=[1], 2=[2, 2], 3=[3, 3, 3]}
}

groupBy함수는 주어진 조건에 따라 원소들을 그룹으로 묶어 을 반환한다.

각 그룹은 키와 그룹에 속한 원소들의 리스트로 구성된다.

 

 

flatMap 함수

fun main() {
    val numList = listOf(listOf(1, 2), listOf(3, 4))
    val flatNumList = numList.flatMap { it.toList() } 
    println(flatNumList) // [1, 2, 3, 4]
    
    val group = listOf(1, 2, 2, 3, 3, 3).groupBy{ it }
    val arr = group.entries.flatMap { listOf(it.value) }
    println(arr) // [[1], [2, 2], [3, 3, 3]]
}

flatMap 함수는 각 원소를 변환하고 그 변환 결과를 평탄화하여 하나의 컬렉션으로 만든다.

두 번째 예시 구문에서 it은 group.entries(맵의 요소)에 해당한다.

 

 

회고

리스트 요소를 그룹화하여 다루는 스킬이 늘었다.

코틀린에는 유용한 함수가 참 많은 것 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함