(구) 알고리즘 기초(백준 알고리즘 태그)/수학

[수학 - 피타고라스 정리(기하학)]백준 Patyki(8723번) 풀이 (C++/Python)

isekaipudding 2026. 4. 30. 12:37

우리가 중학교 2학년 때 "밑변의 제곱과 높이의 제곱의 합은 빗변의 제곱이다"라는 말을 들어본 적 있을 것입니다.

오늘은 피타고라스의 정리에 대해 간단하게 알아보고 그 공식을 활용하여 백준 문제를 해결하도록 하겠습니다.

밑변 a, 높이 b, 빗변 c인 직각삼각형이 있습니다.

피타고라스의 정리에 의하면 직각삼각형일 때 다음과 같은 공식이 성립됩니다.

$$a^2 + b^2 = c^2$$

피타고라스의 정리를 증명하는 방법은 수백 가지 발견되었습니다.

그 중 가장 대중적인 증명 과정 하나를 소개하도록 하겠습니다.

정사각형 ABCD와 정사각형 EFGH가 존재합니다.

이들은 각각 길이가 (a+b), c이며 여기서 밑변이 a, 높이가 b인 직각삼각형 4개가 붙어있는 상태입니다.

수식 전개해서 피타고라스의 정리를 증명하도록 하겠습니다.

$$ \begin{aligned} (a + b)^2 &= 4 \times \frac{1}{2}ab + c^2 \\ a^2 + 2ab + b^2 &= 2ab + c^2 \\ \therefore a^2 + b^2 &= c^2 \end{aligned} $$

이렇게 해서 피타고라스의 정리를 간단하게 증명했습니다.

이제 이 공식을 활용하여 백준 문제를 해결하도록 하겠습니다.

 

 

문제 : 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차원 도형에서 어떤 선분의 길이를 구할 때 굉장히 큰 도움이 되는 공식입니다.

그러므로 이 공식은 꼭 숙지하셔야 합니다.

이상, 피타고라스의 정리에 대해 간단하게 알아봤습니다.