본문 바로가기

코딩/백준 BOJ

[백준/C언어] 4153번 - 직각삼각형

백준 웹사이트 "4153번 - 직각삼각형" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

4153번: 직각삼각형

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

www.acmicpc.net


소스 코드

#include <stdio.h>

int is_right(int a, int b, int c);

int main(void){
    while(1){
        int x, y, z;
        scanf("%d %d %d", &x, &y, &z);
        if(x==0 && y==0 && z==0)
            break;
        else{
            if(is_right(x,y,z))
                printf("right\n");
            else
                printf("wrong\n");
        }
    }
}

int is_right(int a, int b, int c){
    int max, num1, num2;
    if(a>=b && a>=c){ //a가 최대
        max = a;
        num1 = b;
        num2 = c;
    }
    else if(b>=c){  //b가 최대
        max = b;
        num1 = a;
        num2 = c;
    }
    else{  //c가 최대
        max = c;
        num1 = a;
        num2 = b;
    }

    if(max*max == num1*num1 + num2*num2)
        return 1;
    else
        return 0;
}

문제 풀이

  일명 '수포자'인 분들도 피타고라스의 정리에 대해서는 알고 있을 것입니다 (수포자인 분이 제 블로그까지 찾아올 확률은 거의 없겠지만요ㅎㅎ). 피타고라스의 정리를 이용하면 아주 쉽게 풀 수 있는 문제입니다.

  깔끔한 코드를 위해 직각삼각형인지 판별하는 함수 'is_right'를 따로 작성합니다. 세 정수 a, b, c가 입력되면, 우선 이들의 최댓값을 구해 max에 저장하고, 나머지 두 수를 num1, num2에 저장합니다. 세 정수의 최댓값이 곧 빗변이기에, max의 제곱이 num1의 제곱과 num2의 제곱의 합과 같다면 직각삼각형이 됩니다. 이때 return 값이 0 또는 1인데, C언어는 boolean이 따로 없고 0은 false를, 1은 true를 의미하기 때문입니다. 만약 python과 같은 언어였다면 boolean을 이용했을 것입니다.

  main 함수는 '0 0 0'이 입력될 때까지 계속해서 입력을 받도록 while문과 break를 이용합니다. 함수 is_right는 Line 12의 조건문에서 이용되는데, 여기서 함수의 편리성을 체감할 수 있습니다. Line 20 ~ 42에 해당하는 is_right 함수의 코드 전체가 if문의 조건문에 쓰여있다고 생각해보세요! 작성하는데도 이해하는데도 헷갈리겠죠? 이처럼 함수를 적재적소에 잘 이용하면, 코드가 훨씬 아름다워집니다.

반응형