생성일: 2020년 01월 02일
수정일: 2023년 08월 23일
수정일: 2023년 08월 23일
4clojure - Set Intersection (81)
문제
(= (__ #{0 1 2 3} #{2 3 4 5}) #{2 3})
(= (__ #{0 1 2} #{3 4 5}) #{})
(= (__ #{:a :b :c :d} #{:c :e :a :f :d}) #{:a :c :d})
제한 : intersection
풀이
(fn [a b]
(set (sort (filter (fn [x] (not (nil? x))) (mapcat (fn [x] (map (fn [y] (if (= x y) y)) b)) a)))))
풀이과정
풀긴 풀었었지만 뭔가 방식이 석연치 않아서 좀 더 clojure 답게 변경을 하고 싶다. 근데 아무리 생각을 해봐도 반복을 사용해서 밖에 방법이 떠오르지 않아서 다른 답변을 봤는데 황당할 정도로 간단한 방법이 있었다.
#(set (filter % %2))
filter에 그런 동작이 가능한지도 몰랐고, 문법적으로 그게 왜 되는지도 잘 모르겠지만 어쨌든 아래와 같은 동작이 가능하다.
(filter #{0 1 2 3} #{2 3 4 5})
;; (3 2)
또 다른 답변이 뭔가 좀 더 나은 방법으로 보인다. 해석하기도 쉽고
(fn [x y]
(set (filter #(contains? x %) y)))