본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 4153번: 직각삼각형 C언어

문제 출처: www.acmicpc.net/problem/4153

 

4153번: 직각삼각형

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

www.acmicpc.net

1. 코드

#include <stdio.h>

int main(void)
{
    long n1, n2, n3;
    
    while(1)
    {
        long num1, num2, num3;
        scanf("%ld %ld %ld", &n1, &n2, &n3);
        if(n1 == 0 && n2 == 0 && n3 == 0) break;
        
        num1 = n1 * n1, num2 = n2 * n2, num3 = n3 * n3;
        if(num1 + num2 == num3 || num1 + num3 == num2 || num2 + num3 == num1)
            printf("right\n");
        else printf("wrong\n");
    }
    return 0;
}

2. 문제 해결 방식

이 문제를 읽어보면 직각 삼각형인지 판단하는 것이다. 그렇다면 직각 삼각형을 구하는 공식을 알아야 할 것이다. 다행히도 배운 기억이 있어서 쉽게 풀 수 있었다. 작은 두 변들의 제곱은 가장 긴 변의 제곱과 같다면 직각 삼각형이다. 이것을 공식화한다면

작은 변 × 작은 변 + 다른 작은 변 × 다른 작은 변 =  가장 긴 변 × 가장 긴 변
ex) 3 × 3 + 4 × 4 = 5 × 5 -> 9 + 16 = 25 -> 직각 삼각형

그렇다면 공식을 알았으니 이제 코드를 작성해보자. 우선 long 형 변수 3개를 선언하고 무한 반복문에서 지역 변수로 다시 long 형 변수 3개를 선언하였는데 반복문 말고는 쓸 곳이 없다고 생각해서 지역변수로 한번 더 선언하였다. num1에는 n1의 제곱을 num2에서는 n2의 제곱을 num3에서는 n3의 제곱의 값들을 대입한다. 그리고 if 문과 논리 연산자 ||을 통해 문제를 해결한다. 이 문제는 직각 삼각형인지 판단하는 것이다.

공식을 if 문에 대입하고 right 결과가 나오는 것들을 OR 논리 연산자인 || 을 이용하여 진행하고 else 문을 이용하여 아닐 경우에는 wrong을 출력한다.

그런데 이런 의구심이 생길 것이다. 어째서 int형으로 진행하지 않는지에 대해서 말이다. 처음에 int형으로 진행했을 때 틀렸다. 그렇다는 것은 주어지는 테스트를 하는 수가 너무 크기 때문에 오버플로우가 발생했다고 생각하여 long 형으로 진행하였다. 

3. 느낀 점

이번에도 간단한 문제였다. 처음에는 if else 문을 남발하여 그것을 조금 더 깔끔하게 표현하는 것에 대해 고민하는 시간이 더 컸던 것 같다.