PS 문제를 하나씩 풀다 보니, 공부가 필요하다고 느낀 문법을 정리한 글입니다.
PS 문제를 풀다 보면 배열을 자주 사용하게 됩니다.
이때 배열의 총합이나 최솟값, 최댓값을 구해야 하는 경우도 자주 등장합니다.
Kotlin에서는 이런 작업을 반복문 없이도 간단하게 처리할 수 있는 함수를 제공합니다.
이번 글에서는sumOf,minOf,maxOf를 정리해보려고 합니다.
sumOf()는 컬렉션이나 배열의 각 요소를 특정 값으로 변환한 뒤,
그 결과를 모두 더해서 반환하는 함수입니다.
즉, 단순히 “모든 값을 더한다”기보다는
각 요소를 선택(selector)한 뒤 그 값들의 합을 구한다고 이해하면 더 정확합니다.
inline fun IntArray.sumOf(selector: (Int) -> Int): Int
이 형태를 보면 sumOf()는 배열의 각 요소를 selector로 변환한 뒤,
그 결과를 누적해서 더하는 방식으로 동작한다는 것을 알 수 있습니다.
예를 들어 it 자체를 반환하면 원래 값의 합이 되고,
it * 2를 반환하면 각 요소를 2배로 만든 뒤의 합이 됩니다.
fun main() {
val arr = intArrayOf(2, 4, 6, 8, 10)
// 일반 반복문
var sum = 0
for (x in arr) {
sum += x
}
println("배열의 총합 : $sum")
// sumOf 사용
val sumOf = arr.sumOf { it }
println("배열의 총합 : $sumOf")
}
위 예제는 배열이 주어졌을 때 총합을 구하는 방법을 보여줍니다.
반복문으로 직접 더할 수도 있지만,sumOf { it }를 사용하면 의도가 더 간단하게 드러납니다.
다만 여기서 한 가지 알아둘 점이 있습니다.
배열의 값을 그대로 모두 더하는 목적이라면 sumOf { it }보다 sum()이 더 직접적입니다.
fun main() {
val arr = intArrayOf(2, 4, 6, 8, 10)
println(arr.sum())
}
즉,
sum()sumOf()처럼 구분해서 생각하면 이해하기 쉽습니다.
예를 들어 각 요소를 2배로 만든 뒤 합을 구하고 싶다면 sumOf()가 더 잘 어울립니다.
fun main() {
val arr = intArrayOf(2, 4, 6, 8, 10)
val result = arr.sumOf { it * 2 }
println(result)
}
그렇다면 배열에서 최솟값과 최댓값을 구할 때는 어떤 함수를 사용할 수 있을까요?
바로 minOf()와 maxOf()입니다.
이 함수들도 sumOf()처럼 각 요소에서 어떤 값을 꺼내어 비교할지 람다로 전달받습니다.
minOf() : 가장 작은 값을 반환maxOf() : 가장 큰 값을 반환배열의 값 자체를 비교한다면 아래처럼 사용할 수 있습니다.
fun main() {
val arr = intArrayOf(2, 4, 6, 8, 10)
val min = arr.minOf { it }
val max = arr.maxOf { it }
println("최솟값 : $min")
println("최댓값 : $max")
}
위 예제에서는 각 요소 자체를 기준으로 비교했기 때문에
배열의 최솟값과 최댓값을 그대로 얻을 수 있습니다.
다만 이 경우도 배열 원소 자체의 최소, 최대를 구하는 목적이라면
minOrNull(), maxOrNull()을 사용하는 방법도 자주 쓰입니다.
fun main() {
val arr = intArrayOf(2, 4, 6, 8, 10)
println(arr.minOrNull())
println(arr.maxOrNull())
}
백준 10818번은 N개의 정수가 주어졌을 때
최솟값과 최댓값을 구하는 문제입니다.
이 문제는 minOf, maxOf를 활용해서 비교적 간단하게 풀 수 있습니다.
import java.io.StreamTokenizer
fun main() = with(StreamTokenizer(System.`in`.bufferedReader())) {
fun nextInt(): Int {
nextToken()
return nval.toInt()
}
val n = nextInt()
val arr = IntArray(n) { nextInt() }
val min = arr.minOf { it }
val max = arr.maxOf { it }
print("$min $max")
}
IntArray를 생성합니다.minOf { it }로 최솟값을 구합니다.maxOf { it }로 최댓값을 구합니다.문제처럼 배열 안의 값들 중 최소와 최대를 찾아야 할 때,
이런 함수를 사용하면 반복문을 직접 작성하지 않아도 되어 코드가 더 간결해집니다.
이번 글에서는 Kotlin에서 배열을 다룰 때 자주 사용할 수 있는
sumOf, minOf, maxOf를 정리해보았습니다.
이 함수들은 반복문을 직접 작성하지 않고도
합계, 최솟값, 최댓값을 간결하게 구할 수 있게 도와줍니다.
정리하면 다음과 같습니다.
sumOf()는 각 요소를 변환한 뒤 그 합을 구하는 함수입니다.sum()이 더 직접적입니다.minOf()와 maxOf()는 비교 기준을 람다로 전달해서 최소, 최대를 구할 수 있습니다.minOrNull(), maxOrNull()도 자주 사용됩니다.PS 문제에서는 짧고 명확한 코드가 큰 장점이 되기 때문에,
이런 함수들을 익혀두면 문제 풀이를 더 편하게 할 수 있습니다.