본문 바로가기

PROGRAMMING/KOTLIN

[KOTLIN] Collections - foldIndexed

 

https://programmers.co.kr/learn/courses/30/lessons/76501?language=kotlin

 

코딩테스트 연습 - 음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 re

programmers.co.kr

 

이 문제의 다른 정답자 해답을 보며 알게 된 foldIndexed

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/reduce-indexed.html

 

reduceIndexed - Kotlin Programming Language

 

kotlinlang.org

 

우선 fold와 reduce먼저 얘기하자면

val sum = numbers.reduce { sum, element -> sum + element }
val sumDoubled = numbers.fold(0) { sum, element -> sum + element * 2 }

컬렉션의 요소를 연속적으로 계산한 값을 반환하는데

차이점으로는 reduce는 초기값 없이 앞에 2개 값으로 연산을, fold는 초기값을 줄 수 있다.

 

여기에 인덱스 변수까지 주어지며 활용할 수 있는 function이 foldIndexed 

 

사용 방법

위와 같이 파라미터 3개를 활용할 수 있다.

컬렉션의 index, 연산값을 저장할 변수, 해당 index의 반환 값

 

사용 방안

음양 더하기와 같이 다수의 배열이 같은 길이로 존재하며, 순서대로 정렬되어있는 문제를 풀이할 때 사용할 수 있다.

 

사용 예제 

[일반 풀이]

class Solution {
    fun solution(absolutes: IntArray, signs: BooleanArray): Int {
        var answer: Int = 0
        for(i in 0..absolutes.lastIndex){
            if(signs[i]){
                answer += absolutes[i];
            }else{
                answer -= absolutes[i];
            }
        }
        return answer
    }
}

 

[foldIndexed 사용 풀이]

class Solution {
    fun solution(absolutes: IntArray, signs: BooleanArray) =
        absolutes.foldIndexed(0){index, acc, i -> acc + if(signs[index]) i else -i }
}

 

확실히 코드가 간단해지긴 했다.

하지만 내부적으로 for문을 돌리는 건 매한가지라 성능적으론 차이가 없어 보인다.