생성일: 2019년 12월 26일
수정일: 2023년 08월 19일
수정일: 2023년 08월 19일
4clojure - Anagram Finder (77)
문제
(= (__ ["meat" "mat" "team" "mate" "eat"])
#{#{"meat" "team" "mate"}})
(= (__ ["veer" "lake" "item" "kale" "mite" "ever"])
#{#{"veer" "ever"} #{"lake" "kale"} #{"mite" "item"}})
풀이
(fn [coll]
(set (map #(set %)
(filter #(> (count %) 1)
(vals (group-by sort coll))))))
풀이과정
비슷한 단어의 묶음을 만들어서 하면될 것이라고 생각을 했다. 그래서 어떻게 알 수 있을까? 생각을 하다가 sort를 해서 비교를 하면 될 것이라 생각을 했다 어차피 알파벳의 순서는 정해져 있으니까..
그리고 그것을 group-by로 묶어주면 같은 알파벳이 들어간 단어들을 묶어줄 수 있겠다고 생각했다.
(group-by sort ["meat" "mat" "team" "mate" "eat"])
;; {(\a \e \m \t) ["meat" "team" "mate"], (\a \m \t) ["mat"], (\a \e \t) ["eat"]}
(group-by sort ["veer" "lake" "item" "kale" "mite" "ever"])
;; {(\e \e \r \v) ["veer" "ever"], (\a \e \k \l) ["lake" "kale"], (\e \i \m \t) ["item" "mite"]}
여기에 1개 이상이 있는 값을 필터링 하고 vals를 가져오면 문제가 해결 될 것 같았다.
(filter #(> (count %) 1) (vals (group-by sort ["veer" "lake" "item" "kale" "mite" "ever"])))
;; (["veer" "ever"] ["lake" "kale"] ["item" "mite"])
테스트를 돌렸을 때 통과가 안되었다. 자료형까지 다 같아야 하나보다. into 조합으로 set으로 변경하는 함수를 만들었다. 우선 내부의 vector를 변경해야 하므로 아래와 같이 했다.
(map #(into #{} %) '(["veer" "ever"] ["lake" "kale"] ["item" "mite"])
)
;; (#{"ever" "veer"} #{"kale" "lake"} #{"item" "mite"})
그다음 다시 into를 사용해서 바깥의 list를 변경 했다.
(into #{} (map #(into #{} %) '(["veer" "ever"] ["lake" "kale"] ["item" "mite"])))
;; #{#{"kale" "lake"} #{"item" "mite"} #{"ever" "veer"}}
생각해보니 굳이 into를 사용해서 set을 변환하지 않아도 될것 같다.
(set (map #(set %) '(["veer" "ever"] ["lake" "kale"] ["item" "mite"])))
;; #{#{"kale" "lake"} #{"item" "mite"} #{"ever" "veer"}}
최종 해답 함수 이다.
(fn [coll]
(set (map #(set %)
(filter #(> (count %) 1)
(vals (group-by sort coll))))))