생성일: 2019년 11월 15일
수정일: 2022년 10월 29일

4clojure - Reverse Interleave (43)

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

문제

(= (__ [1 2 3 4 5 6] 2) '((1 3 5) (2 4 6)))

(= (__ (range 9) 3) '((0 3 6) (1 4 7) (2 5 8)))

(= (__ (range 10) 5) '((0 5) (1 6) (2 7) (3 8) (4 9)))

풀이

#(apply map list (partition %2 %1))

풀이 과정

지금까지 공부하면서 이것 저것 해본 결과에 대한 도움이 많이 된 것 같다. Medium 문제라서 긴장하고 있었는데 생각보다 간단하게 해결 할 수 있어서 기분은 좋다.

우선 어떻게 나눠서 문제를 풀어야 할까?에 대해서 생각을 많이 하다보니 partition이 떠올랐다.

1번을 예로 들어 partition 을 사용하게 되면

(partition 2 [1 2 3 4 5 6])
;; ((1 2) (3 4) (5 6))

값 하나씩 순회를 하면 될 것이라 생각하고 (map list)를 사용을 했는데

(map list (partition 2 [1 2 3 4 5 6]))
;; (((1 2)) ((3 4)) ((5 6))) 

그래서 다른 방법을 찾아봐야 하는지 생각하다가 그동안 풀었던 문제에서 ((1 2) (3 4) (5 6))을 내부 원소의 1개의 값씩 순회를 하면서 답 과 같은 형태로 만들어주는 방식이 어렴풋이 떠올라서 찾아봤는데

39번 문제애서 그런 형식이 있었다.

근데 (apply map list)인데 왜 답과 같은 형태가 나오는지는 잘 모르겠다...

(map list)에 다수의 파라미터를 넣으면 결과가 같아진다.

(map list ‘(1 2) ‘(3 4) ‘(5 6))
;; ((1 3 5) (2 4 6))

apply의 동작이 단순히 collection을 한개 없애주는 함수인줄 알았는데

(apply map list ((1 2) (3 4) (5 6)))
;;‘(map list ‘(1 2) ‘(3 4) ‘(5 6))

와 같이 식으로 합쳐주는 함수라는 것을 알았다.

clojure는 공부를 하면 할 수록 심오한 함수의 동작에 다시한번 놀라게 된다.

Tags: 4clojure Today I Learn