생성일: 2019년 11월 22일
수정일: 2023년 07월 20일
수정일: 2023년 07월 20일
4clojure - Split by Type (50)
문제
(= (set (__ [1 :a 2 :b 3 :c])) #{[1 2 3] [:a :b :c]})
(= (set (__ [:a "foo" "bar" :b])) #{[:a :b] ["foo" "bar"]})
(= (set (__ [[1 2] :a [3 4] 5 6 :b])) #{[[1 2] [3 4]] [:a :b] [5 6]})
풀이
#(vals (group-by type %))
풀이 과정
같은 조건으로 묶어주는 함수가 group-by라는 것을 문서를 보다가 다시 되뇌었다. 분명히 group-by로 문제를 풀었던 것이 있었는데 생각이 안나는 것을 보면 지속적인 문제 풀이한 것을 봐야하지 않을까?하는 생각이 들었다.
아니면 너무 다른 방식이라서 쉽게 생각을 못했던 것일 수도 있고... 익숙한 방법으로만 생각을 하려고 하다보니 더 쉬운 방법이 생각이 나지 않았다.
우선 group-by를 사용을 했다. 같은 type으로 묶어주면 될 것 같아서 값을 확인 해봤다.
(group-by type [1 :a 2 :b 3 :c])
;; {java.lang.Long [1 2 3], clojure.lang.Keyword [:a :b :c]}
map으로 되어 있는 값을 어떻게 다시 꺼내와야 하는지에 대한 고민을 하다보니 concat으로 되지 않을까 해서 시도를 해봤다
(concat (group-by type [1 :a 2 :b 3 :c]))
;; ([java.lang.Long [1 2 3]] [clojure.lang.Keyword [:a :b :c]])
더 깊숙히 들어가 버렸다... 근데 생각 해보니 hash-map이다, key,value로 구성이 되어 있고 keys, values만 가져올수 있는 함수가 있었다는 것이 생각이 났다. 결국에는 테스트를 통과 하기 위해서는 values만 가져오면 된다는 것이 번뜩 생각 났다
(vals (group-by type [1 :a 2 :b 3 :c]))
;; ([1 2 3] [:a :b :c])