프로젝트 오일러 88
일정한 개수의 숫자들을 더해도 곱해도 같은 값이 되는 경우 조사하기
문제 83과 더불어 내게 가장 어려운 문제 중 하나였다. 안타깝지만 이 문제는 내 두뇌 용량을 넘는 문제여서 풀이를 보고도 이해할 수가 없었다. 아래 코드는 다른 블로그에서 찾은 Python 풀이를 Clojure로 옮긴 것에 불과하다.
(ns p088)
(def kmax 12000)
(defn- prodsum [p s c start n]
(let [k (+ (- p s) c)]
(if (< k kmax)
(do
(if (< p (@n k))
(swap! n assoc k p))
(doseq [i (range start (inc (* (quot kmax p) 2)))]
(prodsum (* p i) (+ s i) (+ c 1) i n))))
n))
(defn solve []
(let [n (atom (vec (repeat kmax (* kmax 2))))]
(->> @(prodsum 1 1 1 2 n)
(drop 2)
(distinct)
(apply +))))
실행하면 빠르게 답을 구한다.
p088=> (time (solve)) "Elapsed time: 150.085615 msecs" ?58745?
prodsum
함수는 Atom
을 인자로 받아 루프를 돌며 업데이트하고 마지막에 다시 Atom
을 리턴한다. 함수 안에서 Atom
을 사용한 것이 마음에 들지 않는다. 나중에 로직을 완전이 이해하게 되면 수정해야 겠다. 언제가 될지는 모르겠지만.