프로그래머스

[프로그래머스_Kotlin] 귤 고르기

내손은개발 🐾 2024. 4. 11. 20:57
 

프로그래머스

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

programmers.co.kr

 

문제

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

 

제한사항

1 ≤ k ≤ tangerine의 길이 ≤ 100,000
1 ≤ tangerine의 원소 ≤ 10,000,000

입출력 예

풀이

class Solution {
    fun solution(k: Int, tangerine: IntArray): Int {
        var answer: Int = 0
        var k = k

        val listMap = hashMapOf<Int, Int>()
        tangerine.forEach {
            listMap[it] = (listMap[it] ?: 0) + 1
        }
        val valueList = listMap.values.sortedDescending()

        var cnt = 0
        var sum = 0
        while (k > sum) {
            sum += valueList[cnt]
            answer++
            cnt++
        }
        return answer
    }
}

초기 코드

 

class Solution {
    fun solution(k: Int, tangerine: IntArray): Int {
        var answer = 0

        val list = tangerine.groupBy { it }.values.map { it.size }
        
        val sortList = list.sortedDescending()
        var cnt = 0
        sortList.takeWhile {
            cnt += it
            answer++
            cnt < k
        }
        return answer
    }
}

 

 

 

 

알게 된 내용

takeWhile

조건을 만족하는 원소들을 담은 리스트를 반환, 처음으로 조건을 만족하지 않을 때 함수를 종료

 

take

처음 n개의 원소를 담은 리스트를 반환

 

takeLast()

마지막 n개의 원소를 담은 리스트를 반환

 

예제코드

val arrayList = arrayListOf(1, 2, 3, 4, 5, 6, 7, 8, 9)

print("take() : ")
println(arrayList.take(3))

print("takeWhile() : ")
println(arrayList.takeWhile { it < 6 })

print("takeLast() : ")
println(arrayList.takeLast(3))

 

groupBy

key-value 타입으로 만들어 주며

Key는 group을 묶어줄 조건이고

Value는 Key 조건에 만족하는 원소들 리스트이다.