출처 : http://euler.synap.co.kr/prob_detail.php?id=39
세 변의 길이가 모두 자연수 {a, b, c}인 직각삼각형의 둘레를 p 로 둘 때, p = 120 을 만족하는 직각삼각형은 아래와 같이 세 개가 있다.
{20, 48, 52}, {24, 45, 51}, {30, 40, 50}
1000 이하의 둘레 p에 대해서, 직각삼각형이 가장 많이 만들어지는 p의 값은 얼마인가?
Ruby
a+b < c 일 때. a * (2a-p) < 0. 따라서 0 < a < p/2, 0 < b <= a, c = sqrt(a^2 + b^2)
find_circum = ->p_len,circums=Hash.new(0) do
cnt = ->a,b,c { circums[a+b+c] += 1 if (a+b+c <= p_len) && (c%1 == 0) }
(1...p_len/2).each {|a| (1..a).each {|b| cnt[a,b,(a**2+b**2)**0.5] } }
circums.max_by(&:last)
end
Test
expect( find_circum[120] ).to eq [120, 3]
expect( find_circum[1000] ).to eq [840, 8]
2016年07月17日 20:21
풀이 작성