생성일: 2019년 11월 11일
수정일: 2023년 11월 26일

4clojure - Interleave Two Seqs (39)

  1. 문제
  2. 풀이
  3. 풀이2

문제

(= (__ [1 2 3] [:a :b :c]) '(1 :a 2 :b 3 :c))

(= (__ [1 2] [3 4 5 6]) '(1 3 2 4))

(= (__ [1 2 3 4] [5]) [1 5])

(= (__ [30 20] [25 15]) [30 25 20 15])

제한 : interleave

풀이

mapcat list

mapcat이라는 함수가 단순히 map + apply + concat의 합친 함수인줄 알았는데 실제로 해보니 두 함수만 가지고는 해결이 안된다는 것을 깨닫게 되었다. 간단하게 위와같은 형태로 해결이 가능하지만, map + apply + concat으로 해결한 풀이도 추가 한다.

풀이2

#(->> (map list %1 %2)
		(apply concat))

mapcat 함수를 분석 해보니

(apply concat (apply map f colls))

부분이 있었다 apply map f에 대한 의문점이 생겼었는데 이는 mapcat의 파라미터가 [f & coll]에서 오는 파라미터의 가변성에 착안한 구현이라고 생각 했다.

예를 든다면 (mapcat list [1 2 3] [:a :b :c]) 일때 내부적으로는

(apply map list [[1 2 3][:a :b :c]])

의 형태로 묶여서 들어가므로 apply가 꼭 필요하다. 예전에 알아두었던 개념이었는데 다시 상기를 하면서 정리 한다.

Tags: 4clojure Today I Learn