생성일: 2019년 11월 12일
수정일: 2024년 01월 01일

4clojure - Interpose a Seq (40)

  1. 문제
  2. 풀이

문제

(= (__ 0 [1 2 3]) [1 0 2 0 3])

(= (apply str (__ ", " ["one" "two" "three"])) "one, two, three")

(= (__ :z [:a :b :c :d]) [:a :z :b :z :c :z :d])

제한 : interpose

풀이

(fn [value y] (butlast (mapcat (fn [x] (list x value)) y)))

butlast는 마지막 값을 버리는 함수이다.

위 풀이 과정이 있지만 좀 더 나은 방법이 없는지 solution을 확인 하였는데 interleave, repeat의 조합을 활용 하는 방법이 있었다.

interleave는 갯수가 같은 seq 2개이상 이 있어야 사용이 가능하지만 repeat을 이용하면 하나의 원소를 반복한 seq로 만들어주게 되어 활용이 가능하다. repeat는 기본적으로 lazy이므로 take를 같이 사용해야 값을 가져올 수 있다.

(take 3 (repeat 0))
;(0 0 0) 앞의 ;는 주석
(interleave (repeat 0) [1 2 3])
;(0 1 0 2 0 3)

interleave를 보다가 mapcat + repeat 조합으로 같은 결과를 가져올 수 있을 것 같아 시도를 해봤다.

(mapcat list (repeat 0) [1 2 3])
;(0 1 0 2 0 3)

mapcat이 가능하면 map + concat + apply도 가능하므로 사용을 해봤다. 보기 편하기 위해서 ->>를 사용하였다.

(->> (map list (repeat 0) [1 2 3])
	   (apply concat))
;(0 1 0 2 0 3)

문제의 결과와 같기 위해서는 처음의 0은 없어야 하므로 rest 함수를 사용 하여 처음 값을 버리고 나머지 값을 사용하도록 하면 결과와 같아진다.

Tags: 4clojure Today I Learn