안녕하세요 남갯입니다
오늘은 드로이드나이트에서 코틀린던젼으로 문제를 냈던
레이니스트(뱅크샐러드)의 문제를 포스팅해보려합니다.
1번문제
첫번째 문제는 1 ~ 6의 숫자를 가진 리스트에 함수를 넣어 큰 순서대로 나열하는 문제입니다.
SUM
val sum = numbers.filter { num -> num % 2 == 0 }.sum()
filter는 각각의 숫자를 넣어서 num%2 ==0을 만족하는 수를 출력해주는 함수입니다.
즉 [1,2,3,4,5,6} 은 짝수만 남게됩니다. {2,4,6}
그후 sum()은 합을 구하는 함수입니다.
2 + 4 + 6 = 12가 나오게됩니다.
SUM = 12
FOLD
val fold = numbers.fold(1) { sum, num -> sum + num }
fold는 초기값을 넣고 초기값을 넣은 sum , 각각의 숫자 num을 이용해
각각의 값을 구하는 형태입니다.
이전글에 포스팅한 내용이 있으므로 자세한내용은
여기 참고하시기 바랍니다.
즉 sum =1이고
num을 통해 sum += 1 , sum += 2 ..... sum += 6까지 한 값
22가 나오게됩니다.
FOLD = 22
REDUCE
val reduced = numbers.reduce { sum, num -> sum + num }
reduce함수는 fold함수와 비슷합니다.
코틀린 문서에서 가져온것을 보면
fold함수와의 차이점은 initial 값이 있는지 없는지의 차이를 갖고 있습니다.
reduce = 21
reduce와 fold함수의 차이점
val empty = emptyList<Int>()
val emptyReduce = empty.reduce { sum, num -> sum + num } //error
val emptyFold = empty.fold(1) { sum, num -> sum + num } // return 1
위와같이 아무것도없는 빈 리스트에 reduce를 넣게되면 에러가 나게됩니다.
fold함수는 초기값을 설정하기 때문에 에러가 나지않고 1이 출력이 되는것을 볼 수 있습니다.
GROUP BY
val grouped = numbers.groupBy { num -> num % 2 == 1 }
.map { group -> group.value }
.minBy { nums -> nums.sum() }
?.map { num -> num * 2 }
?.sum()
groupby는 아래와같이 조건을 갖고 T의 리스트를 K 키값에 그룹을 지어주는 함수입니다.
val grouped = numbers.groupBy { num -> num % 2 == 1 }
(num%2 == 1) 은 true 혹은 false를 반환하기 때문에
true 라는 key에 num%2 == 1을 만족하는 숫자가 들어가게됩니다.
true[1,3,5]
false[2,4,6]
으로 나누어지게 됩니다.
Map
val grouped4 = numbers.groupBy { num -> num % 2 == 1 }
.map { group -> group.value }
true[1,3,5], false[2,4,6] key를 제외한 group.value로 매핑을 시키는 함수힙니다.
즉 [[1,3,5],[2,4,6]] 으로 매핑시키죠
Map ex)
val mapResult = listOf(1, 2, 3).map { it * 2 } // you get a new list instance returned
result : [2,4,6]
minBy
val grouped = numbers.groupBy { num -> num % 2 == 1 }
.map { group -> group.value }
.minBy { nums -> nums.sum() }
리스트가 null이 아닐경우 아까 반환한 그룹 [[1,3,5],[2,4,6]] 의 sum의 합의 작은값의 그룹을 반환하게됩니다.
1 + 3 + 5 = 9 , 2 + 4 + 6 = 12
즉 [1,3,5]를 반환하게 됩니다.
마지막
val grouped = numbers.groupBy { num -> num % 2 == 1 }
.map { group -> group.value }
.minBy { nums -> nums.sum() }
?.map { num -> num * 2 }
?.sum()
여기서 map을 시킨값의 2배들을 곱하고 그 값을 합하는것으로 끝나게 됩니다.
[2,6,10]을 반환하게 되고 모든값의 합인 18을 반환하게 됩니다.
GroupBy = 18
정답
SUM = 12
FOLD = 22
Reduce = 21
GroupBy = 18
Fold - Reduce - GroupBy - Sum 순이 됩니다.
'IT > kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 확장 함수 (Kotlin extension functions) 예제 및 정리 (0) | 2019.08.08 |
---|---|
[드로이드나이츠] 뱅크샐러드 코틀린던전 2, 3번문제 (0) | 2019.04.09 |
[kotlin] 제너릭 변성(variance) 정리 (1) | 2019.03.26 |
[코틀린] Higher order function 정리 (0) | 2019.02.20 |
[fold 함수] fold 함수 알아보기 (0) | 2019.02.19 |