프로젝트 오일러 52

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

프로젝트 오일러 52

2배, 3배, 4배, 5배, 6배의 결과도 같은 숫자로 이루어지는 가장 작은 수?

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

어떤 두 수가 같은 숫자로 이루어져 있는지 비교하려면 두 수를 모두 자릿수로 분해한 다음 정렬해 결과가 같은지 확인하면 된다. str 함수로 숫자를 문자열로 바꾼 다음 sort로 정렬하면 각 자릿수가 정렬된 시퀀스를 얻을 수 있다. compsortstr을 합성하면 인자를 문자열로 바꿔 정렬하는 함수를 만들 수 있다. 주어진 여러 개의 숫자가 모두 같은 숫자로 이루어져 있는지 확인하는 함수는 다음과 같이 쉽게 구현할 수 있다.

(defn all-has-same-digits? [v]
  (->> v
       (map (comp sort str))
       (apply =)))

이제 숫자를 증가시키며 1, 2, ..., 6을 곱해 나온 숫자들이 같은 숫자로 되어 있는지 all-has-same-digits?로 확인하기만 하면 된다.

(defn solve []
  (->> (iterate inc 1)
       (map #(for [i [1 2 3 4 5 6]] (* i %)))
       (filter #(all-has-same-digits? %))
       ffirst))

실행 결과는 다음과 같다.

p052=> (time (solve))
"Elapsed time: 729.828531 msecs"
1428??

참고