사분면 안의 직각삼각형 개수 세기
1사분면 에서 P의 가능한 위치는 모두 이고 Q의 가능한 위치도 이다. 무차별 대입법으로 문제를 푼다면 번의 루프를 돌면서 직각인지 확인해야 하므로 빠른 시간에 답을 구하지 못한다. 이 방법으로 문제를 풀면 내 환경에서는 답을 구하는 데 7초 이상 걸린다.
1사분면 위의 임의의 점 P와 Q가 있을 때 가 직각이 되는 경우는 P가 축 위에, Q가 축 위에 있는 (또는 그 반대) 경우뿐이다. P가 1사분면 안쪽에 있는 경우에는 가 직각이 되어야 한다.
P가 축에 있는 경우는 선분 에 수직인 직선이 수직선이 되어 기울기가
P가
P가
P가
(def LIMIT 50)
(def points
(for [x (range 1 (inc LIMIT)) y (range 1 (inc LIMIT))]
[x y]))
이제 직선
이 직선은 점
따라서 직선
주어진 점 P
(defn fn-line-perpendicular-to [[a b]]
(fn [x] (+ (/ (* (- a) x) b) b (/ (* a a) b))))
이제 P에 각 점을 대입하면서
따라서 직각 삼각형의 개수는 다음과 같이 구할 수 있다.
(defn solve []
(->> points
(map fn-line-perpendicular-to)
(map (fn [f] (->> (range (inc LIMIT))
(map f)
(filter integer?)
(filter #(<= 0 % 50))
count
dec))) ; P=Q인 경우는 제외
(apply +)
(+ 2500) ; P, Q가 각각 x축, y축에 있는 경우
(+ 2500) ; P는 x축, Q는 1사분면 안에 있는 경우
(+ 2500))) ; P는 y축, Q는 1사분면 안에 있는 경우
실행 결과는 다음과 같다.
p091=> (time (solve)) "Elapsed time: 98.809821 msecs" ??234