오늘은 interleave란 함수를 소개하는 것으로 시작한다.
문제 43, Reverse Interleave
(= (__ [1 2 3 4 5 6] 2) '((1 3 5) (2 4 6)))
두번째 인자로 주어진 갯수의 리스트로 분리해내는 함수다. 말그대로 interleave의 반대방향함수다. (정확히 역함수는 아니다)
2주전에 풀었던 코드는 이제 막 loop/recur만 사용하는 수준. accumulator에 n개만큼 나누어놓고 다시 map vector로 첫 머리를 가져온다. 처음 건 partition이고 두번째 건 transpose.
;; 110
(fn [list n]
(->> (loop [acc []
list list]
(if (empty? list)
acc
(recur (conj acc (take n list)) (drop n list))))
(apply map vector)))
앞부분을 partition으로 바꾸면,
;;48
(fn [list n]
(->> (partition n list)
(apply map vector)))
#()을 적용하여...
;;32
#(apply map vector (partition %2 %1))
문제 50번, Split by Type
(= (set (__ [1 :a 2 :b 3 :c])) #{[1 2 3] [:a :b :c]})
타입이 같은 것들끼리 묶어서 set으로 만들어준다. group-by의 value만 취한 것과 같다.
2주전 기본 풀이는 (into #{})으로 set을 만들고, (map type)으로 오리지널 리스트를 다시 각 타입으로 filter한 것이다. 뭔가 매우 비효율적인것 같음. ㅠ.ㅠ
;; 73
(fn [list]
(into #{}
(->> (map type list)
(map (fn [t]
(filter #(= t (type %)) list))))))
group-by를 사용하면,
;;27
#(set(vals(group-by type %)))
그런데 가만보니 문제가 요구한 건 seq면 충분하다. (set)으로 변환하니까.
;;22
#(vals(group-by type %))
문제 43, Reverse Interleave
(= (__ [1 2 3 4 5 6] 2) '((1 3 5) (2 4 6)))
두번째 인자로 주어진 갯수의 리스트로 분리해내는 함수다. 말그대로 interleave의 반대방향함수다. (정확히 역함수는 아니다)
2주전에 풀었던 코드는 이제 막 loop/recur만 사용하는 수준. accumulator에 n개만큼 나누어놓고 다시 map vector로 첫 머리를 가져온다. 처음 건 partition이고 두번째 건 transpose.
;; 110
(fn [list n]
(->> (loop [acc []
list list]
(if (empty? list)
acc
(recur (conj acc (take n list)) (drop n list))))
(apply map vector)))
앞부분을 partition으로 바꾸면,
;;48
(fn [list n]
(->> (partition n list)
(apply map vector)))
#()을 적용하여...
;;32
#(apply map vector (partition %2 %1))
문제 50번, Split by Type
(= (set (__ [1 :a 2 :b 3 :c])) #{[1 2 3] [:a :b :c]})
타입이 같은 것들끼리 묶어서 set으로 만들어준다. group-by의 value만 취한 것과 같다.
2주전 기본 풀이는 (into #{})으로 set을 만들고, (map type)으로 오리지널 리스트를 다시 각 타입으로 filter한 것이다. 뭔가 매우 비효율적인것 같음. ㅠ.ㅠ
;; 73
(fn [list]
(into #{}
(->> (map type list)
(map (fn [t]
(filter #(= t (type %)) list))))))
group-by를 사용하면,
;;27
#(set(vals(group-by type %)))
그런데 가만보니 문제가 요구한 건 seq면 충분하다. (set)으로 변환하니까.
;;22
#(vals(group-by type %))
댓글 없음:
댓글 쓰기