-
[프로그래머스] 위장 (Kotlin)문제풀이/프로그래머스 2021. 6. 28. 15:20
https://programmers.co.kr/learn/courses/30/lessons/42578?language=kotlin
내 풀이
풀이(1)
class Solution { fun solution(clothes: Array<Array<String>>): Int { var answer = 1 val sep = HashMap<String, Int>() for (cloth in clothes) { sep[cloth[1]]?.let { sep.put(cloth[1], it + 1) } ?: sep.put(cloth[1], 1) } for (i in sep) { answer *= (i.value + 1) } return (answer - 1) } }
let 함수와 HashMap을 이용한, 문제의 명세서 흐름에 충실한...
이름붙이자면 절차지향 맛보기 함수형 프로그래밍을 통한 풀이.
수행시간은 0.5x[ms]로 상당히 빠른 편이지만 Not really Kotlin Style.
풀이(2)
class Solution { fun solution(clothes: Array<Array<String>>): Int { var answer:Int = 1 clothes.groupBy { it[1] } .toList() .map { it.second.size + 1 } .map { answer *= it } return answer - 1 } }
어제 베스트앨범 문제에서 다른 사람의 풀이를 분석하면서 눈을 뜬, 함수형 프로그래밍을 적용해보았습니다.
Line 7에서 사용되지 않는 쓸데없는 list가 하나 만들어지지만... Iterable elements를 이용하기 위해서 map 메서드를 사용하였습니다.
수행시간은 9.8x[ms]로 굉~~장히 느렸습니다. But can be called as a little bit... Kotlin Style.
다른 사람의 풀이
풀이(1)
class Solution { fun solution(clothes: Array<Array<String>>) = clothes .groupBy { it[1] }.values .map { it.size + 1 } .reduce(Int::times) .minus(1) }
저의 풀이와 비슷하지만, 몇가지 절차가 축약되면서 수행시간이 5.x[ms]로 훨씬 단축되었습니다.
하지만 저의 풀이(1)보다는 확연히 느린 속도.
새로 배운 메서드 reduce에 대해 알아보겠습니다.
reduce()
inline fun <S, T : S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S
Collection이나 List의 데이터를 operation을 수행하여 모두 모아주는 accumulating 함수.
비슷한 것으로는 fold() 함수가 있습니다. 둘의 차이점은 다음과 같습니다.
reduce()는 초깃값이 없이 객체의 첫번째 원소부터 시작합니다.
fold()는 초깃값을 파라미터로 받아 operation를 수행합니다.
즉, 만약 여기에서 reduce(Int::times)를 통해 100의 값이 리턴되었다면,
fold(10) { acc, v -> acc * v }를 통해서는 1000의 값이 리턴됩니다.
풀이(2)
class Solution { fun solution(clothes: Array<Array<String>>) = clothes.groupBy { it[1] }.values.fold(1) { acc, v -> acc * (v.size + 1) } - 1 }
이 풀이에 이런 댓글이 달려있었습니다. 제 생각과 같았습니다.
'내가 뭘 본거지...?' ㅋㅋㅋㅋㅋ
수행시간을 잡아먹는 주범인 map 함수를 아예 배제하고, fold 함수를 이용하여 람다식으로 바로 풀어버렸습니다.
따라서 수행시간이 대폭 단축되어 내 첫 풀이보다 짧은 무려 ★ 0.3x[ms] ★ 로 나왔습니다.
역시 함수형 프로그래밍은 재밌어.. 하하