Skip to content

Instantly share code, notes, and snippets.

@yangwansu
Last active January 2, 2016 16:19
Show Gist options
  • Save yangwansu/8329834 to your computer and use it in GitHub Desktop.
Save yangwansu/8329834 to your computer and use it in GitHub Desktop.
http://euler.synap.co.kr/prob_detail.php?id=1 10보다 작은 자연수 중에서 3 또는 5의 배수는 3, 5, 6, 9 이고, 이것을 모두 더하면 23입니다. 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면 얼마일까요?
(#(range %1 %2 %1) 3 10)
(#(range %1 %2 %1) 5 10)
;; 렉시컬 범위의 함수를 이용하고 3 과 5의 배수 리스트를 더한후 유니크한 Set 만 추출 하여 계산
(letfn [(multiful [number limit]
(seq (range number limit number)))]
(apply +
(set (concat (multiful 3 1000) (multiful 5 1000))))
)
;; 루프를 돌며 3과 5의 배수만 필터한 목록의 합
(reduce + (filter #(if (= 0 (* (mod % 3) (mod % 5))) %) (range 1000)))
@yangwansu
Copy link
Author

만약 3의 배수목록을 구할 수 있는 방법을 구한다.
-> 클로저에서 찾아보니 range 란게 있군.. step 을 이용하여 배수를 구할 수 있군...
3의 배수 목록을 전부 더하는 방법은???
-> apply 를 사용 할 수 있음을 직감? ㅋ

이번에는 요구사항인 3의 배수 목록과 5의 공통된 배수의 합의 경우를 생각해보자.
공통된 배수는 중복해서 더하면 안되기 때문에 두 수의 목록에서 합친후 유니크한 값들만 더해야한다.
유니크 하니 set 이 떠오름 --> 혹시나해서 클로저 사이트에서 확인
앗 그런데 두 결과 목록 어떻게 합치지??? 찾아보니concat 이란게 있었음 ㅋㅋ
concat 으로 합친 목록을 set 을 이용해 유크한 값만 빼오고 apply 를 사용해 목록의 모든 값에 + 연산을 함

참고 url http://clojuredocs.org/quickref/Clojure%20Core

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment