본문 바로가기

IT/kotlin언어

[드로이드나이츠] 뱅크샐러드 코틀린던전 1번문제

안녕하세요 남갯입니다


오늘은 드로이드나이트에서 코틀린던젼으로 문제를 냈던 


레이니스트(뱅크샐러드)의 문제를 포스팅해보려합니다.


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을 이용해

각각의 값을 구하는 형태입니다.

이전글에 포스팅한 내용이 있으므로 자세한내용은

여기 참고하시기 바랍니다.

https://namget.tistory.com/entry/fold-%ED%95%A8%EC%88%98-fold-%ED%95%A8%EC%88%98-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0


즉 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 순이 됩니다.