본문 바로가기
Language/Kotlin

[Kotlin] zip(), mapIndexed(), filterNotNull()

by Jman 2023. 7. 9.

Leetcode 알고리즘 문제를 풀다가 자주 쓰지 않았던 함수를 사용하게 되어 정리를 하게 됐다.

 

Leetcode - Find the Town Judge /

fun findJudge(n: Int, trust: Array<IntArray>): Int {
    val trustee = Array(n) { 0 }
    val givener = Array(n) { 0 }
    trust.forEach {
        trustee[it.last() - 1]++
        givener[it.first() - 1]++
    }
    val candidates = trustee.zip(givener).mapIndexed { index, values ->
            if (values.first == n - 1 && values.second == 0) index + 1 else null
        }.filterNotNull()

    return if (candidates.size == 1) candidates.first() else -1
}

 

zip

두 컬렉션의 자료들을 조합하여 새로운 자료를 만들 때 사용한다.
두 컬렉션 간 자료의 개수가 달라도 되고, 더 적은 개수에 컬렉션쪽으로 따라 간다.
조합된 결과는 Pair로 만들어주고, 원할 경우 규칙을 정의할 수 있다.

위 코드로 확인해보면, trustee 배열과 givener 배열을 조합하여 Pair 타입으로 변환하였고, 그 이후 mapIndexed 를 통해서 또 다른 규칙을 정의하여 새로운 자료를 handling 할 수 있다.

 

 

mapIndexed

컬렉션 내의 자료들과 그 자료의 인덱스를 사용하여 변환할 수 있다.

위 코드로 확인해보면, zip 함수를 이용하여 새로운 자료를 만든 뒤, 새로 마든 하나의 컬렉션 내의 자료와 자료의 인덱스를 가지고 어떠한 조건 정의를 내릴 수 있게 하였다.

 

 

filterNotNull

기존에 filter 함수는 Boolean 값에 따라 필터링을 할지 안 할지 결정한다. 
여기서 filterNotNull 은 컬렉션의 자료가 null 일경우,  null 값을 제외하고 반환을 하게 된다.

위 코드로 확인해보면, mapIndexed 함수를 사용하여 조건을 준 뒤, else 로 null 값을 반환하게 만들었고, 그 null 을 최종 스트림 결과 값에 포함시키지 않기 위해서 filterNotNull 함수를 사용했다.