Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 직각삼각형의 나머지 두 변 구하기

문제 개요

이 문제에서는 직각삼각형의 한 변을 나타내는 정수 a가 주어집니다. 우리가 해야 할 일은 변 a를 포함하는 직각삼각형이 성립할 수 있는지 확인하고, 성립한다면 나머지 두 변의 값을 구하는 것입니다.

예제로 문제 이해하기

입력

a = 5

출력

Sides : 5, 12, 13

설명

구해진 세 변은 피타고라스 정리를 만족합니다. 즉, 52 + 122 = 132 이 성립하므로 5, 12, 13은 유효한 직각삼각형의 세 변입니다.

풀이 접근 방법

이 문제의 가장 간단한 해결책은 피타고라스 정리(Pythagorean theorem)를 활용하는 것입니다. 직각삼각형의 세 변은 항상 다음 관계를 만족합니다.

a2 + b2 = c2

여기서 a와 b는 직각을 이루는 두 변이고, c는 빗변(hypotenuse)입니다. 이 공식을 응용하면 주어진 값 a만으로 나머지 두 변 b와 c를 계산할 수 있습니다. 계산식은 a가 홀수인지 짝수인지에 따라 달라집니다.

Case 1: a가 짝수인 경우

b = (a2 / 4) - 1
c = (a2 / 4) + 1

Case 2: a가 홀수인 경우

b = (a2 - 1) / 2
c = (a2 + 1) / 2

단, a = 1 또는 a = 2인 경우에는 위 공식으로도 조건을 만족하는 양의 정수 변을 가진 직각삼각형이 존재하지 않으므로, 이때는 -1을 출력하여 불가능함을 알려야 합니다.

구현 예제 코드

아래는 위 풀이 과정을 C++로 구현한 프로그램입니다.

예제

#include <bits/stdc++.h>
#include <cmath>
using namespace std;
#define PI 3.1415926535

void printOtherSides(int n) {
    int b, c;
    if (n & 1) { // n이 홀수인 경우
        if (n == 1)
            cout << -1 << endl;
        else {
            b = (n*n - 1) / 2;
            c = (n*n + 1) / 2;
        }
    } else { // n이 짝수인 경우
        if (n == 2)
            cout << -1 << endl;
        else {
            b = n*n/4 - 1;
            c = n*n/4 + 1;
        }
    }
    cout << "Sides : a = " << n << ", b = " << b << ", c = " << c << endl;
}

int main() {
    int a = 5;
    printOtherSides(a);
    return 0;
}

출력 결과

Sides : a = 5, b = 12, c = 13

마무리

이처럼 피타고라스 정리를 변형한 공식을 활용하면, 하나의 변만 주어져도 복잡한 반복문 없이 O(1)의 시간 복잡도로 직각삼각형의 나머지 두 변을 바로 계산할 수 있습니다. 다만 a가 1 또는 2인 특수한 경우에는 정수 변으로 직각삼각형을 만들 수 없다는 점을 반드시 예외 처리해 주어야 합니다.