생성일: 2019년 12월 08일
수정일: 2023년 08월 04일

4clojure - Group a Sequence (63)

  1. 문제
  2. 풀이
    1. 풀이 과정

문제

(= (__ #(> % 5) [1 3 6 8]) {false [1 3], true [6 8]})

(= (__ #(apply / %) [[1 2] [2 4] [4 6] [3 6]])
   {1/2 [[1 2] [2 4] [3 6]], 2/3 [[4 6]]})

(= (__ count [[1] [1 2] [3] [1 2 3] [2 3]])
   {1 [[1] [3]], 2 [[1 2] [2 3]], 3 [[1 2 3]]})

풀이

(fn [f coll]
  (into {} (map #(vector (f (first %)) (vec %))
                (partition-by f (sort coll)))))

풀이 과정

이렇게 풀었었는데 다시 보기 좋게 ->> 로 작성 해봤다.

(fn [f coll]
	(->> (sort coll)
        (partition-by f)
		  (map #(vector (f (first %)) (vec %)))
		  (into {})))

풀어본지 오래 되다보니 되새기는데 시간이 좀 걸리긴 한다.. 밑에는 풀이 과정에 따른 값의 변화 이다.

(partition-by #(> % 5) (sort [1 3 6 8]))
;; ((1 3) (6 8))

(map #(vector ((fn [x] (> x 5)) (first %)) (vec %)) '((1 3) (6 8)))
;; ([false [1 3]] [true [6 8]])

(into {} '([false [1 3]] [true [6 8]]))
;; {false [1 3], true [6 8]}

중간에 map 함수가 잘 이해가 가지 않았었는데 생각해보니 partitoin-by를 계산 하면서 미리 계산해둔 값이므로 first만 확인 하든, 전체를 확인 하든 f에 대한 같은 결과 이므로 first만 확인을 하는 것이 계산 하는데 유리하다고 생각 했고, 어차피 값이 같다고 생각을 했던 것 같다.

Tags: 4clojure Today I Learn