데이터분석/python

#8. 피타고라스 삼조

dataminutestone 2025. 10. 27. 19:37

조건)

 

'피타고라스 정리'라고 들어 보셨나요? 직각삼각형에서, 빗변의 제곱이 두 직각변의 제곱의 합과 같다는 정리입니다.

거기서 나온 '피타고라스 삼조'라는 개념이 있는데요. 피타고라스 삼조란, 피타고라스 정리(a2+b2=c2)를 만족하는 세 자연수 쌍 (a,b,c)입니다.

 

예를 들어, 32+42=52이기 때문에 (3,4,5)는 피타고라스 삼조입니다.

a<b<c라고 가정할 때, a+b+c=400을 만족하는 피타고라스 삼조 (a,b,c)는 단 하나인데요. 이 경우, 는 얼마인가요?

 

문제 출처: Project Euler Problem 9

 

과정)

 

진짜 어렵다

일단, 자연수를 조건으로 넣어야 할 것 같다고 생각했는데,, , 패스하고 다음 조건부터 해보자.

 

is_natural = a > 0 and isinstance(a, int)

 

이런 식으로 자연수 조건을 걸 수 있다곤 합니다.

 

일단, a<b<c의 조건을 따지면 a가 최댓값일 때의 순서쌍이 (132, 133, 135)이 나오므로, a < 133이 된다.

 

for문의 범위지정을 하면 자연수 조건을 따로 지정하지 않아도 된다.

for a in range(1,133):

 

이렇게 a 조건을 가져왔는데,,

 

비슷하게 대입해서 b의 범위를 구하면

for b in range(2, 134)

 

c의 최솟값은 135가 된다 그리고 a와 b의 최솟값인 1과 2를 대입하면 c의 최댓값은 397..

for c in range(136, 398)

 

이렇게 a, b, c에 자연수 and 범위를 조건으로 걸어줬다.

for a in range(1, 133):
    for b in range(2, 134):
        for c in range(136, 398):
            if a < b < c and a + b + c == 400:
                print(a * a + b * b + c * c)

 

for 중첩문으로 if 조건을 걸었더니 너무 많은 결과가 출력되었다....

 

if 문을 맨 첫 열로 넣으면 또 a 변수값을 지정하지 않은 오류가 발생

 

여기까지를 기반으로 챗지피티에 넣어본 결과

 

더보기

1️⃣ 핵심 조건이 빠져 있음

현재 코드는 이렇게 되어 있지 👇

 
if a < b < c and a + b + c == 400: print(a * a + b * b + c * c)

문제:

  • 여기에는 피타고라스 조건 (a² + b² == c²)  없어!
  • 그래서 “400을 만드는 조합”만 찾고, “직각삼각형 조건”은 검사하지 않음.

2️⃣ c의 범위가 비효율적이고 잘못됨

 
for c in range(136, 398):
  • 범위를 136~397로 제한해놨는데, 근거가 불분명함.
  • a + b + c == 400 조건이 있기 때문에 c는 자동으로 조절돼야 해.
  • 사실 a와 b가 정해지면 c는 그냥 400 - a - b 로 구할 수 있음.
    굳이 세 번째 반복문 필요 없음.

정작 중요한 피타고라스 조건을 빼먹음;;; 진짜 레전드다

그리고, c의 조건은 알아서 나오는 건데 굳이 넣을 필요가 없었다.

컴퓨터는 당연히 나보다 똑똑한 것을 ....

 

for a in range(1, 133):
    for b in range(2, 134):
        for c in range(136, 398):
            if a < b < c and a + b + c == 400 and a * a + b * b == c * c:
                print(a * b * c)

 

하지만 또 틀렸음

 

모범답안

 

for a in range(1, 400):
    for b in range(a + 1, 400):
        c = 400 - a - b
        if a * a + b * b == c * c:
            print(a, b, c)
            print("곱:", a * b * c)

 

피드백)

 

1. 주어진 조건을 더 러프하게 잡아주면 된다. 코딩은 수학문제풀이가 아니다...! 답을 내는 것보다 문제를 내는 사람이 되어야 함.

2. 변수가 세 개라면, 변수가 모두 포함된 식이 있다면, 두개의 조건만 걸어줘도 된다. 기본적인 방정식의 상식임. .

'데이터분석 > python' 카테고리의 다른 글

aliasing  (0) 2025.10.28
dictionary함수  (0) 2025.10.28
for문 정리  (0) 2025.10.27
#6. 리스트 함수 활용  (0) 2025.10.27
#5. 환전 서비스  (0) 2025.10.27