Compress a Sequence – 4Clojure #30

http://www.4clojure.com/problem/30

Difficulty:    Easy
Topics:   seqs

test not run (= (apply str (__ “Leeeeeerrroyyy”)) “Leroy”)
test not run (= (__ [1 1 2 3 3 2 2 3]) ‘(1 2 3 2 3))
test not run (= (__ [[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)) [] %)
  1. 입력할 요소(a)를 확인한 후
  2. 추가대상이면 현재 시퀀스(s)에 추가하고,
  3. 아니면 시퀀스(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을 풀 때도 그러했지만, ‘클로저가 제공하는 함수들과 그 관점을 얼마나 익숙하게 떠올리고 활용할 수 있는가’ 가 간단한 문제해결에 다가설 수 있는 비결인 것 같다.

 

 

Author: Seonho Kim