생성일: 2019년 11월 13일
수정일: 2022년 10월 12일

4clojure - Drop Every Nth Item (41)

Problem

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

(= (__ [:a :b :c :d :e :f] 2) [:a :c :e])

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

Solved

(fn [x y]
  (keep-indexed #(if (not= (mod (+ %1 1) y) 0) %2) x))

나머지 연산을 사용하여 index에 해당하는 배수는 필터링 하고, 나머지 값을 출력하는 문제이다. keep-indexed 함수가 있는데 index, value 형식으로 값을 준다.

(keep-indexed list [:a :b])
;((0 :a) (1 :b))

mod는 나머지 연산 함수 이다.

(mod 1 3)
;1

(mod 9 3)
;0

Solved 2

apply concat #(partition-all (dec %2) %2 %1)

solution에는 partition-all이라는 함수가 있는데 묶는 갯수, step을 값으로 받아서 출력하는 방식을 사용 하고 있다.

(partition-all 2 3 [1 2 3 4 5 6 7 8])
;((1 2) (4 5) (7 8))

2개씩 값을 묶고, 3step으로 이동하여 나오는 결과 이다.

나뉘어져 있는 결과를 apply + concat 을 사용하여 묶어주면 된다. partition 함수와 비슷한 역할을 하는데 partition은 3개씩 묶고 1개가 남으면 그것을 버리는데 partition-all은 3개씩 묶고 1개가 남으면 그것도 같이 출력을 한다.

Solved 3

(defn my-dropitem3 [coll x]
  (->> (take (count coll) (iterate inc 1))
       (map list coll)
       (remove (fn [[_ k]] (= 0 (mod k x))))
       (map (fn [[v _]] v))))

filter를 사용하여 할 수 있는 방법이 있지 않을까 생각을 하다가 k v로 값을 만들어서 걸러주는 방법을 이용 해도 되지 않을까 싶어서 26번 문제를 참고하여 답을 만들었다. thread last를 사용하기 위해서 k v의 위치를 바꿔서 사용 하였고, mod의 값이 0일 경우 삭제하는 remove를 사용하여 구현 하였다.

Tags: 4clojure Today I Learn