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 함수를 사용했다.
'Language > Kotlin' 카테고리의 다른 글
[Kotlin IN ACTION] - 코틀린 생성자(2) (0) | 2022.07.29 |
---|---|
[Kotlin IN ACTION] - Kotlin 클래스 선언(주 생성자, 프로퍼티) (0) | 2022.07.25 |
[Kotlin IN ACTION] - Kotlin sealed 클래스 (0) | 2022.07.25 |
[Kotlin IN ACTION] - Kotlin 접근 제어자(가시성 변경자) / 내부 클래스 / 중첩 클래스 (0) | 2022.07.25 |
[Kotlin IN ACTION] - Kotlin open / final / abstract 상속 제어(접근) 변경자 (0) | 2022.07.22 |