프로젝트 오일러 88

내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.

프로젝트 오일러 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을 사용한 것이 마음에 들지 않는다. 나중에 로직을 완전이 이해하게 되면 수정해야 겠다. 언제가 될지는 모르겠지만.

참고