본문 바로가기
개발/알고리즘 문제

[Project Euler 39] 가장 많은 직각삼각형이 만들어지는 둘레(≤ 1000)의 길이는?

by 유다110 2016. 5. 5.
반응형

세 변의 길이가 모두 자연수 {a, b, c}인 직각삼각형의 둘레를 p 로 둘 때, p = 120 을 만족하는 직각삼각형은 아래와 같이 세 개가 있습니다.


{20, 48, 52}, {24, 45, 51}, {30, 40, 50}


1000 이하의 둘레 p에 대해서, 직각삼각형이 가장 많이 만들어지는 p의 값은 얼마입니까?


피타고라스 정의를 이용하는 문제.

일단 수도코드


#1차) 101.58초(왓더...)

#2차) 24.49초. a, b for loop를 전부 도는 대신 p/2로 변경

#3차) 23.42초. math.ceil() 대신 round를 씀. 다른 것도 math.sqrt()를 써봤는데 안 쓰는 게 더 빠른 듯하다.

#4차) 12.57초. 여기서부터는 로직이 아니라 수학(이걸 수학이라 부를 수 있다면.)이 들어감. p를 돌릴 때, 1000까지 다 찾지 말고, 짝수만 찾음. 짝수가 당연히 경우의 수가 많을테니.


>>> 같은 로직이라도 수학을 알면 훨씬 빠르게 짤 수 있다.

>>> 가장 큰 값이 되는 p 값을 뽑아내보니 전부 12의 배수였다.

>>> p의 for loop를 12의 배수만 돌리면 2초 정도로 줄지만, 왜 12의 배수인지 완벽히 이해하지 못했으므로 짝수만 돌린다.

반응형

댓글