문제
경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 '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 조건에 만족하는 원소들 리스트이다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스_Kotlin] 연속 부분 수열 합의 개수 (0) | 2024.04.15 |
---|---|
[프로그래머스_Kotlin] 괄호 회전하기 (0) | 2024.04.12 |
[프로그래머스_Kotlin] 멀리 뛰기 (1) | 2024.04.08 |
[프로그래머스_Kotlin] N개의 최소공배수 (0) | 2024.04.05 |
[프로그래머스_Kotlin] 예상 대진표 (0) | 2024.04.04 |