생성일: 2019년 12월 26일
수정일: 2023년 08월 19일

4clojure - Anagram Finder (77)

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

문제

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