1 minute read

4clojure problems

새로운 언어를 배우고 있다. 바로 클로저(clojure). 2년 정도 꾸준히 공부해 볼 생각이다. 일 년에 새로운 언어 하나는 아무리 생각해봐도 무리. 그렇게 말한 아자씨들은 지금 실천하고 있을까?

그래서 대충 보고 묵혀놨던 프로그래밍 클로저를 최근에 다 봤다. 물론 최대한 코드를 많이 짜면서 책을 읽었다. github에 hello-clojure 프로젝트를 만들고 책에 나온 내용에 대한 unit test 코드를 짰다. 이제 조그만 장난감 프로젝트를 시작할 차례다. 현업에서 사용 안 하는 언어기 때문에 필수.

장난감 프로젝트를 하기 전 예열이 필요했다. 아직 클로저가 많이 낯설기도 하고. 심시티를 하려고 점심시간을 비워놨건만 서버가 개판이라서 점심시간에 할 놀이도 필요했고. 그래. 이럴 땐, 프로젝트 오일러 문제가 딱이지. 그러던 차에 4clojure 사이트를 알게 됐다.

nil

빈칸 채우기 문제. 테스트를 통과하는 함수를 짜면 된다. 짜서 제출하고 위에서부터 녹색불이 하나씩 켜지는 걸 보는 재미가 쏠쏠하다.

core-functions, destructuring, higher-order-functions, seqs, … 꼭 알아야 하는 주제들로 구성했다. 여기에 알고리즘 문제까지. 난 특히 특정 함수 안 쓰고 풀어야 하는 문제가 재미있었다.

nil

총 153문제. 현재 Easy까지 풀었다.

똑같은 문제를 다른 사람은 어떻게 풀었을까? 문제 풀이도 공부되지만 잘하는 사람 풀이를 보는 것도 정말 공부가 많이 된다. maximental 아저씨 추천. 이 사람 해답을 보며 배우는 재미가 쏠쏠했다. 클로져 소개 강의를 한 psk810님도 추천. 153문제 다 푼 사람이 별로 없는데, 이 분도 다 풀었다.

;; ohyecloudy solution to Trees into tables
;; https://4clojure.com/problem/146

(fn [c]
  (reduce
    merge
    (map (fn [k v]
           (reduce
             merge
             {}
             (map #(assoc {} (vector k %1) %2) (keys v) (vals v))))
         (keys c)
         (vals c))))

; maximental solution:
; 아아. for 내부에서도 중복 바인딩이 가능하다.

#(into {} (for [[i j] % [k l] j] [[i k] l]))

위키에 풀 때마다 다른 해답을 보며 정리를 하는데, 내가 젤 어렵게 풀고 있어.