생성일: 2020년 01월 02일
수정일: 2023년 08월 23일

4clojure - Set Intersection (81)

  1. 문제
  2. 풀이
    1. 풀이과정

문제

(= (__ #{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)))
Tags: 4clojure Today I Learn