프로젝트 오일러 89

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

프로젝트 오일러 89

로마숫자 최적화하기

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

먼저 다음과 같이 텍스트 파일을 읽어 시퀀스로 만들어둔다.

(ns p089
  (:require [clojure.string :as str]))

(def romans (str/split (slurp "data/roman.txt") #"\r\n"))

로마숫자 최적화는 다음과 같은 간단한 로직으로 수행할 수 있다.

  • DCCCCCM으로 치환한다.
  • CCCCCD로 치환한다.
  • LXXXXXC로 치환한다.
  • XXXXXL로 치환한다.
  • VIIIIIX로 치환한다.
  • IIIIIV로 치환한다.

이를 Clojure 함수로 구현하면 다음과 같다.

(defn shorten [r]
  (-> r
      (str/replace "DCCCC" "CM")
      (str/replace "CCCC"  "CD")
      (str/replace "LXXXX" "XC")
      (str/replace "XXXX"  "XL")
      (str/replace "VIIII" "IX")
      (str/replace "IIII"  "IV")))

시퀀스에 있는 문자의 개수를 구하는 함수가 있으면 문제를 푸는 데 도움이 된다.

(defn count-chars [coll]
  (->> (map count coll)
       (apply +)))

위 두 함수를 이용해 다음과 같이 문제를 풀 수 있다. 최적화 전 문자수와 최적화 후 문자수의 차를 구하면 된다.

(defn solve []
  (let [cnt0 (count-chars romans)
        cnt1 (count-chars (map shorten romans))]
    (- cnt0 cnt1)))

실행 결과는 다음과 같다.

p089=> (time (solve))
"Elapsed time: 3.597621 msecs"
7?3

참고