문제 출처: www.acmicpc.net/problem/4153
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 문을 남발하여 그것을 조금 더 깔끔하게 표현하는 것에 대해 고민하는 시간이 더 컸던 것 같다.
'컴퓨터 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 3053번: 택시 기하학 C언어 (0) | 2020.04.04 |
---|---|
백준 알고리즘 3009번: 네 번째 점 C언어 (0) | 2020.03.29 |
백준 알고리즘 1085번: 직사각형에서 탈출 C언어 (0) | 2020.03.22 |
백준 알고리즘 9020번: 골드바흐의 추측 C언어 (0) | 2020.03.20 |
백준 알고리즘 4948번: 베르트랑 공준 C언어 (0) | 2020.03.18 |