우리가 중학교 2학년 때 "밑변의 제곱과 높이의 제곱의 합은 빗변의 제곱이다"라는 말을 들어본 적 있을 것입니다.
오늘은 피타고라스의 정리에 대해 간단하게 알아보고 그 공식을 활용하여 백준 문제를 해결하도록 하겠습니다.

밑변 a, 높이 b, 빗변 c인 직각삼각형이 있습니다.
피타고라스의 정리에 의하면 직각삼각형일 때 다음과 같은 공식이 성립됩니다.
피타고라스의 정리를 증명하는 방법은 수백 가지 발견되었습니다.
그 중 가장 대중적인 증명 과정 하나를 소개하도록 하겠습니다.

정사각형 ABCD와 정사각형 EFGH가 존재합니다.
이들은 각각 길이가 (a+b), c이며 여기서 밑변이 a, 높이가 b인 직각삼각형 4개가 붙어있는 상태입니다.
수식 전개해서 피타고라스의 정리를 증명하도록 하겠습니다.
이렇게 해서 피타고라스의 정리를 간단하게 증명했습니다.
이제 이 공식을 활용하여 백준 문제를 해결하도록 하겠습니다.
문제 : Patyki(8723번)(Bronze IV)
문제 링크 : https://www.acmicpc.net/problem/8723
출처 : Baekjoon Online Judge
이 문제는 정말로 간단합니다.
1. 만약 정삼각형이면 2 출력
2. 그게 아니라 직각삼각형이면 1 출력
3. 그 외의 경우는 0 출력
우선 가장 먼저 정삼각형인 경우를 확인하겠습니다.
정삼각형의 조건은 딱 하나입니다.
"모든 변의 길이가 같을 것"
즉, a와 b가 같고 b와 c가 같으면 됩니다.(그러면 나머지 a와 c는 자동으로 성립됩니다.)
그러므로 C++에서는 아래와 같이 작성해주시면 됩니다.
if(a == b && b == c) cout << 2;
그런데 만약 정삼각형이 아니라면 직각삼각형인지 확인해야 합니다.
하지만 여기서 한 가지 사소한 문제가 발생했습니다.
바로 a, b, c가 문제에서 무작위로 입력되어서 어느 변이 빗변인지 모른다는 것입니다.
원래라면 정렬(sorting)을 사용해서 간단하게 해결할 수 있으나 아직 정렬에 배우지 않았고 삼각형이라는 특수한 경우이니 다음과 같은 소스 코드로 구현할 수 있습니다.
int a, b, c;
cin >> a >> b >> c;
// 1. 최댓값(빗변) 구하기
int z = a;
z = (b > z) ? b : z;
z = (c > z) ? c : z;
// 2. 최솟값(밑변 혹은 높이) 구하기
int x = a;
x = (b < x) ? b : x;
x = (c < x) ? c : x;
// 3. 중간값(나머지 한 변) 구하기
// 전체 합에서 가장 큰 놈과 가장 작은 놈을 빼면 중간 놈만 남음
int y = (a + b + c) - z - x;
이렇게 하면 빗변을 구하면서 밑변과 높이를 구할 수 있게 됩니다.
이제부터 피타고라스의 정리를 적용해서 이 문제를 해결하도록 하겠습니다.
if(x * x + y * y == z * z) cout << 1;
else cout << 0;
피타고라스의 정리를 이용하여 해당 삼각형이 직각삼각형인지 알 수 있게 됩니다.
예를 들어 a = 4, b = 5, c = 3인 경우 x = 3, y = 4, z = 5가 되고 3*3 + 4*4 = 5*5가 성립되므로 해당 삼각형은 직각삼각형으로 판정됩니다.
지금까지 했던 과정을 C++로 전체 구현하겠습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a, b, c;
cin >> a >> b >> c;
if(a == b && b == c) {
cout << 2;
return 0;
}
int z = a;
z = (b > z) ? b : z;
z = (c > z) ? c : z;
int x = a;
x = (b < x) ? b : x;
x = (c < x) ? c : x;
int y = (a + b + c) - z - x;
if(x * x + y * y == z * z) cout << 1;
else cout << 0;
return 0;
}
이 때 조심해야 하는 것은 정삼각형으로 판정된 후 return 0;으로 프로그램 종료해야 합니다.
그렇지 않으면 아래에 0도 함께 출력되어 결과값이 "20"으로 출력되는 반례가 발생합니다.
참고로 Python에서는 max, min, sum을 이용하여 다음과 같이 해결할 수 있습니다.
import sys
input = sys.stdin.readline
a, b, c = map(int, input().split())
if a == b == c :
print(2)
sys.exit(0)
x, y, z = 0, 0, 0
x = min([a, b, c])
z = max([a, b, c])
y = sum([a, b, c]) - x - z
if x ** 2 + y ** 2 == z ** 2 :
print(1)
else :
print(0)
피타고라스의 정리는 2차원 혹은 3차원 도형에서 어떤 선분의 길이를 구할 때 굉장히 큰 도움이 되는 공식입니다.
그러므로 이 공식은 꼭 숙지하셔야 합니다.
이상, 피타고라스의 정리에 대해 간단하게 알아봤습니다.
'(구) 알고리즘 기초(백준 알고리즘 태그) > 수학' 카테고리의 다른 글
| [수학 - 제곱근]백준 제곱 수?(34027번) 풀이 (C++/Python) (0) | 2026.05.01 |
|---|---|
| [수학 - 사칙연산]백준 나머지(10430번) 풀이 (C++/Python) (0) | 2026.01.28 |