프로젝트 오일러 67

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

프로젝트 오일러 67

삼각형에서 경로의 합 중 최대값을 구하는 효율적인 방법은?

문제 자세히 보기: [국어] [영어]

문제 18과 동일한 문제다. 문제 18에서는 삼각형이 15층에 불과했지만, 여기서는 100층이다. 문제 18에서 이미 제대로 된 방법으로 문제를 풀었기 때문에 똑같은 방법을 사용해 문제를 풀 수 있다. 텍스트 파일로 주어진 데이터를 읽어들이는 코드만 추가해주면 된다.

데이터 파일을 읽어 문제 18에서 사용했던 triangle 구조를 만드는 코드는 다음과 같이 작성할 수 있다.

(ns p067
  (:require [util :refer [parse-int]]
            [clojure.string :refer [split]]))

(defn- split-by-line [content]
  (split content #"\r\n"))

(defn- parse-line [line]
  (->> (split line #" ") (map parse-int)))

(def triangle
  (->> (slurp "data/triangle.txt")
       split-by-line
       (map parse-line)
       reverse))

풀이는 문제 18과 동일하다.

(defn find-max [t]
  (reduce (fn [ls vs] (map max (map + ls vs) (map + (rest ls) vs))) t))

(defn solve []
  (first (find-max (reverse triangle))))

실행 결과는 다음과 같다. 충분히 빠르게 답을 구한다.

p067=> (time (solve))
"Elapsed time: 14.006805 msecs"
7??3

참고