생성일: 2020년 01월 05일
수정일: 2023년 08월 26일

4clojure - Cartesian Product (90)

  1. 문제
  2. 풀이

문제

(= (__ #{"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로만 가능하다는 사실에 적잖게 놀랐다.

Tags: 4clojure Today I Learn