조건)
'피타고라스 정리'라고 들어 보셨나요? 직각삼각형에서, 빗변의 제곱이 두 직각변의 제곱의 합과 같다는 정리입니다.
거기서 나온 '피타고라스 삼조'라는 개념이 있는데요. 피타고라스 삼조란, 피타고라스 정리(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️⃣ 핵심 조건이 빠져 있음
현재 코드는 이렇게 되어 있지 👇
문제:
- 여기에는 피타고라스 조건 (a² + b² == c²) 이 없어!
- 그래서 “400을 만드는 조합”만 찾고, “직각삼각형 조건”은 검사하지 않음.
2️⃣ c의 범위가 비효율적이고 잘못됨
- 범위를 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 |