| 문제
과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오.
| 입력
입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.
| 출력
각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다.
| 예제 입력 1
6 8 10
25 52 60
5 12 13
0 0 0
| 예제 출력 1
right
wrong
right
| 문제의 키 포인트
1. 직각삼각형의 규칙을 활용하자.
> 대각선의 길이(변3) = √(변1)2 + (변2)2
2. 조건문이 참이면 "right", 거짓이면 "wrong"을 출력한다.
3. 마지막에 주어지는 0 0 0을 통해 반복문을 탈출한다.
| 해결방안(Solution)
1. 기본적으로 직각삼각형의 규칙을 활용해 조건을 판단한다.
2. 조건문은 무한반복으로 실행하되, 0 0 0이 주어지면 반복문을 종료하도록 구성한다.
| 소스코드 1(SourceCode 1)
// BOJ_4153_Right_triangle, 직각삼각형
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
int a, b, c;
while (1)
{
scanf("%d %d %d", &a, &b, &c);
if (a == 0 && b == 0 && c == 0)
{
break;
}
if (c == sqrt(pow(a, 2) + pow(b, 2)))
{
printf("right\n");
}
else
{
printf("wrong\n");
}
}
return 0;
}
간단히 생각한다면, c를 가장 긴 변으로 생각하고 코드를 구성하면 되었습니다. 하지만, 문제에서 마지막수가 가장 긴 변이라는 조건을 주지 않았으므로, 이렇게 제출했더니 '틀렸습니다'가 되돌아왔습니다.
| 소스코드 2(SourceCode 2)
// BOJ_4153_Right_triangle, 직각삼각형
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
int a, b, c;
int max, num1, num2;
while (1)
{
scanf("%d %d %d", &a, &b, &c);
// 반복문 종료
if (a == 0 && b == 0 && c == 0)
{
break;
}
// 주어진 세 개의 값 중 가장 큰 값 판별
if (a > b)
{
if (a > c)
{
max = a;
num1 = b;
num2 = c;
}
else
{
max = c;
num1 = a;
num2 = b;
}
}
else
{
if (b > c)
{
max = b;
num1 = a;
num2 = c;
}
else
{
max = c;
num1 = a;
num2 = b;
}
}
// 직각삼각형 여부 판단
if (max == sqrt(pow(num1, 2) + pow(num2, 2)))
{
printf("right\n");
}
else
{
printf("wrong\n");
}
}
return 0;
}
첫번째 풀이에서 간과했던 세 개의 값 중 가장 큰 변을 찾는 조건을 추가해주었다. 하지만, 작성하다보니 코드의 길이가 너무 길어져서 다른 형태를 조금 더 생각해보았습니다.
| 소스코드 3(SourceCode 3)
// BOJ_4153_Right_triangle, 직각삼각형
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#define size 3
int main(void)
{
int arr[size] = { 0, };
int i;
int max = 0, temp = 0;
while (1)
{
// 입력부
for (i = 0; i < size; i++)
{
scanf("%d", &arr[i]);
}
// 반복문 종료
if (arr[0] == 0 && arr[1] == 0 && arr[2] == 0)
{
break;
}
else
{
max = 0;
temp = 0;
// 세 개의 값 중 가장 큰 값 판별
for (i = 0; i < size; i++)
{
if (max < arr[i])
{
max = arr[i];
}
}
// 직각삼각형 여부 판단
for (i = 0; i < size; i++)
{
if (arr[i] != max)
{
temp += pow(arr[i], 2);
}
}
if (pow(max, 2) == temp)
{
printf("right\n");
}
else
{
printf("wrong\n");
}
}
}
return 0;
}
이번에는 앞서 a, b, c로 받아왔던 구조에서 배열로 값들을 받아오는 형태로 변경해보았습니다.
코드의 길이는 약간 더 길어졌지만, 구조적으로 이 편이 더 나을 것 같네요.
| 소스코드 비교
소스코드 2와 소스코드 3를 비교해보았는데요.
길이는 얼추 비슷하지만, 메모리에서 소스코드 3가 1116KB로 소스코드 2의 1128KB보다 약간 더 적게 먹더군요.
이상입니다. 그럼 오늘도 즐거운 코딩!
| 문제출처
https://www.acmicpc.net/problem/4153
4153번: 직각삼각형
입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.
www.acmicpc.net
'코딩 | 알고리즘 & 문제풀이 > 백준_Backjoon' 카테고리의 다른 글
[C언어] Backjoon_Code 1002, 터렛 (0) | 2021.08.02 |
---|---|
[C언어] Backjoon_Code 3053, 택시 기하학 (0) | 2021.08.01 |
[C언어] Backjoon_Code 3009, 네 번째 점 (0) | 2021.07.30 |
[C언어] Backjoon_Code 1085, 직사각형에서 탈출 (0) | 2021.07.29 |
[C언어] Backjoon_Code 9020, 골드바흐의 추측 (0) | 2021.07.28 |