생성일: 2019년 11월 13일
수정일: 2022년 10월 12일
수정일: 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를 사용하여 구현 하였다.