관리 메뉴

꿈꾸는 개발자

4153번 직각삼각형 C++ 본문

백준(BOJ)

4153번 직각삼각형 C++

rickysin 2022. 4. 29. 11:27

문제

과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오.

입력

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

출력

각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다.


접근법: 피타고라스 정리를 떠올리면 직각삼각형의 조건을 어렵지 않게 코드로 구현할 수 있을 것이다! 

주의점: 처음 접근 할 때 예제의 입력값들이 오름차순이라 당연히 오름차순으로만 입력되겠지? 하며 코드를 작성하면 

틀릴 수도 있다. 입력되는 변의 크기가 언제나 오름차순으로 주어지지 않을 가능성 또한 함께 고려해야 한다(이것을 고려 하지 않아 몇 번이나 틀림.....)

#include<bits/stdc++.h>
using namespace std;
int main(void) {
	int a, b, c;
	while (1) {
		cin >> a >> b >> c;
		if (a == 0 && b == 0 && c == 0)break;
		else {
			if (a > b && a > c) {
				if ((a * a) == ((b * b) + (c * c)))cout << "right" << "\n";
				else cout << "wrong" << "\n";
			}
			else if (b > a && b > c) {
				if ((b * b) == ((a * a) + (c * c)))cout << "right" << "\n";
				else cout << "wrong" << "\n";
			}
			else if (c > a && c > b) {
				if ((c * c) == ((b * b) + (a * a)))cout << "right" << "\n";
				else cout << "wrong" << "\n";
			}

		}
	}
}

노가다식 코드 내가 작성했지만 참 별로다......(몇 번 틀리고 나서 생각하는 걸 포기하고 작성했다.....반성)

다른 사람 코드:

#include <iostream>
using namespace std;

int main() {
	while (1) {
		int x, y, z;
		int temp = 0;
		cin >> x >> y >> z;
		if (x == 0 && y == 0 && z == 0)
			return 0;

		if (x > y) {
			temp = y;
			y = x;
			x = temp;
		}
		if (y > z) {
			temp = z;
			z = y;
			y = temp;
		}

		if (z*z == x * x + y * y)
			cout << "right\n";
		else
			cout << "wrong\n";
	}
}

이렇게 애초에 swap을 사용해 입력된 각 변을 오름차순으로 정렬하는 것이 더 좋아보인다. 가능하면 STL swap 함수를 사용한다면, 코드 길이 줄어들고 가독성도 더 좋아질 것이다!