생성일: 2020년 01월 05일
수정일: 2023년 08월 26일
수정일: 2023년 08월 26일
4clojure - Cartesian Product (90)
문제
(= (__ #{"ace" "king" "queen"} #{"♠" "♥" "♦" "♣"})
#{["ace" "♠"] ["ace" "♥"] ["ace" "♦"] ["ace" "♣"]
["king" "♠"] ["king" "♥"] ["king" "♦"] ["king" "♣"]
["queen" "♠"] ["queen" "♥"] ["queen" "♦"] ["queen" "♣"]})
(= (__ #{1 2 3} #{4 5})
#{[1 4] [2 4] [3 4] [1 5] [2 5] [3 5]})
(= 300 (count (__ (into #{} (range 10))
(into #{} (range 30)))))
풀이
(fn [a b]
(into #{} (mapcat (fn [x] (map #(vector x %) b)) a)))
이중 for문의 느낌으로 문제가 해결 되었다. 뭔가 깔끔하게 해결된 느낌은 아니긴 하지만 문제를 풀었다는데 의의를 둬야 할 것 같다.
다른 풀이 중 간단한 풀이가 있는데 아래와 같다
#(set (for [x %1 y %2] [x y]))
기본적으로 생각 할 때의 for는 단 하나의 자료에 대해서만 반복이 가능하다고 생각할 수 있는데 clojure에서는 이중으로 할 때도 단 하나의 for로만 가능하다는 사실에 적잖게 놀랐다.