티스토리 뷰
코드카타
귤 고르기
문제
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(맵의 요소)에 해당한다.
회고
리스트 요소를 그룹화하여 다루는 스킬이 늘었다.
코틀린에는 유용한 함수가 참 많은 것 같다.
'내일배움캠프 > Android 국비지원' 카테고리의 다른 글
TIL 22일차 (연속 부분 수열 합의 개수 - Kotlin) (0) | 2024.06.17 |
---|---|
TIL 21일차 (괄호 회전하기 - Kotlin) (1) | 2024.06.16 |
TIL 19일차 (멀리 뛰기 - Kotlin | 키오스크 Lv4 구현) (0) | 2024.06.14 |
TIL 18일차 (N개의 최소공배수 - Kotlin | 키오스크 Lv1 ~ Lv3 구현) (0) | 2024.06.13 |
TIL 17일차 (예상 대진표 - Kotlin | 코틀린 심화문법 정리 2) (0) | 2024.06.12 |