[Kotlin] sumOf

Hood·2024년 12월 27일

Kotlin

목록 보기
11/18
post-thumbnail

✍ 코틀린과 친해지자

PS 문제를 하나씩 풀다 보니, 공부가 필요하다고 느낀 문법을 정리한 글입니다.


🔎 sumOf, minOf, maxOf

들어가기 전

PS 문제를 풀다 보면 배열을 자주 사용하게 됩니다.
이때 배열의 총합이나 최솟값, 최댓값을 구해야 하는 경우도 자주 등장합니다.
Kotlin에서는 이런 작업을 반복문 없이도 간단하게 처리할 수 있는 함수를 제공합니다.
이번 글에서는 sumOf, minOf, maxOf를 정리해보려고 합니다.


sumOf

sumOf()는 컬렉션이나 배열의 각 요소를 특정 값으로 변환한 뒤,
그 결과를 모두 더해서 반환하는 함수입니다.

즉, 단순히 “모든 값을 더한다”기보다는
각 요소를 선택(selector)한 뒤 그 값들의 합을 구한다고 이해하면 더 정확합니다.

공식 문서 형태

inline fun IntArray.sumOf(selector: (Int) -> Int): Int

이 형태를 보면 sumOf()는 배열의 각 요소를 selector로 변환한 뒤,
그 결과를 누적해서 더하는 방식으로 동작한다는 것을 알 수 있습니다.

예를 들어 it 자체를 반환하면 원래 값의 합이 되고,
it * 2를 반환하면 각 요소를 2배로 만든 뒤의 합이 됩니다.


Kotlin에서 sumOf 사용하기

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

그렇다면 배열에서 최솟값과 최댓값을 구할 때는 어떤 함수를 사용할 수 있을까요?
바로 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())
}

BOJ 10818 예제로 보기

백준 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")
}

풀이 흐름

  1. 입력받은 개수만큼 IntArray를 생성합니다.
  2. minOf { it }로 최솟값을 구합니다.
  3. maxOf { it }로 최댓값을 구합니다.
  4. 결과를 출력합니다.

문제처럼 배열 안의 값들 중 최소와 최대를 찾아야 할 때,
이런 함수를 사용하면 반복문을 직접 작성하지 않아도 되어 코드가 더 간결해집니다.


📌 결론

이번 글에서는 Kotlin에서 배열을 다룰 때 자주 사용할 수 있는
sumOf, minOf, maxOf를 정리해보았습니다.

이 함수들은 반복문을 직접 작성하지 않고도
합계, 최솟값, 최댓값을 간결하게 구할 수 있게 도와줍니다.

정리하면 다음과 같습니다.

  • sumOf()는 각 요소를 변환한 뒤 그 합을 구하는 함수입니다.
  • 배열의 원소를 그대로 모두 더할 때는 sum()이 더 직접적입니다.
  • minOf()maxOf()는 비교 기준을 람다로 전달해서 최소, 최대를 구할 수 있습니다.
  • 배열 자체의 최소, 최대만 필요하다면 minOrNull(), maxOrNull()도 자주 사용됩니다.

PS 문제에서는 짧고 명확한 코드가 큰 장점이 되기 때문에,
이런 함수들을 익혀두면 문제 풀이를 더 편하게 할 수 있습니다.

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글