http://www.4clojure.com/problem/30
Difficulty: Easy
Topics: seqs
![]() |
(= (apply str (__ “Leeeeeerrroyyy”)) “Leroy”) |
![]() |
(= (__ [1 1 2 3 3 2 2 3]) ‘(1 2 3 2 3)) |
![]() |
(= (__ [[1 2] [1 2] [3 4] [1 2]]) ‘([1 2] [3 4] [1 2])) |
내 풀이 방법..
#(reduce (fn [s a] (if (not= (last s) a) (conj s a) s)) [] %)
- 입력할 요소(a)를 확인한 후
- 추가대상이면 현재 시퀀스(s)에 추가하고,
- 아니면 시퀀스(s)를 그대로 유지
reduce 를 활용한 단순한(?) 방법이다.
일단 머리에 떠오르는대로 알고리즘을 구현한 것인데, 다른 사람들의 솔루션을 확인하고 대충격.
;; maximental's solution: #(map last (partition-by list %)) ;; daowen's solution: #(map first (partition-by identity %))
partition-by 라는 충격적인 함수가 있었던 것.
콜렉션의 함수를 인자로 받아서 콜렉션의 각 요소에 적용한 다음, 다른 결과가 나오는 요소들끼리 콜렉션으로 묶어준다. 위 문제의 경우 partition-by 을 적용한 다음 하나씩만 뽑아내면(first 또는 last) 끝.
4clojure #26을 풀 때도 그러했지만, ‘클로저가 제공하는 함수들과 그 관점을 얼마나 익숙하게 떠올리고 활용할 수 있는가’ 가 간단한 문제해결에 다가설 수 있는 비결인 것 같다.