본문 바로가기

# 프로그래밍 개발/04. 알고리즘 문제풀이

백준 알고리즘 6322번 [직각 삼각형의 두변] 문제풀이 코드 공개

반응형

백준 알고리즘 6322번 직각삼각형의 두변 문제 풀이코드

문제

컴퓨터를 이용하면 수학 계산이 조금 쉬워진다. 다음과 같은 예를 살펴보자. 세 변의 길이가 a, b, c(c는 빗변)이면서 a2+b2=c2를 만족하는 삼각형을 직각삼각형이라고 한다. 이 공식은 피타고라스의 법칙이라고 한다.

직각 삼각형의 두 변의 길이가 주어졌을 때, 한 변의 길이를 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 직각 삼각형의 세 변의 길이 a, b, c가 주어진다. a, b, c중 하나는 -1이며, -1은 알 수 없는 변의 길이이다. 다른 두 수는 10,000보다 작거나 같은 자연수이다.

입력의 마지막 줄에는 0이 세 개 주어진다. 

출력

각 테스트 케이스에 대해서, 입력으로 주어진 길이로 직각 삼각형을 만들 수 있다면, "s = l"을 출력한다. s는 길이가 주어지지 않은 변의 이름이고, l은 길이이다. l은 소수점 셋째 자리까지 출력한다. 삼각형을 만들 수 없는 경우에는 "Impossible."을 출력한다.

예제 입력과 출력 결과 이미지

출처

ICPC > Regionals > Europe > Southwestern European Regional Contest > SWERC 1997 PB번

  • 문제를 번역한 사람: baekjoon
  • 문제의 오타를 찾은 사람: rootcucu
  • 데이터를 추가한 사람: waylight3

코드 제출 결과
왜 틀렸습니다가 있는거지.. 이유를 알 수 없는 제출 결과이다.

일단 틀렸습니다. 의 결과를 받은 코드를 먼저 공개합니다. 

#include<cstdio>
#include<cmath>
int main(){
	float a,b,c;
	int ct = 1;
	while(scanf("%f %f %f",&a,&b,&c)){
		if(a == 0 && b == 0 && c == 0) break;
		float res = 0.000;
		if(a == -1){
			res = sqrt(c*c-b*b);
		}else if(b == -1){
			res = sqrt(c*c-a*a);
		}else{
			res = sqrt(a*a+b*b);
		}
		printf("Triangle #%d\n",ct++);
		if(a >= c || b >= c){
			printf("Impossible.\n\n");
		}else{
			if(a == -1) printf("a");
			else if(b == -1) printf("b");
			else printf("c");
			printf(" = %.3f\n\n",res);
		}
	}
}

음.. 왜 틀렸을지 잘 모르겠네요. 

다음은 정답 코드를 공개합니다. 

#include<cstdio>
#include<cmath>
int main(){
	float a,b,c;
	int ct = 1;
	while(scanf("%f %f %f",&a,&b,&c)){
		if(a == 0 && b == 0 && c == 0) break;
		float res = 0.000;
		if(a == -1){
			res = sqrt(c*c-b*b);
		}else if(b == -1){
			res = sqrt(c*c-a*a);
		}else{
			res = sqrt(a*a+b*b);
		}
		printf("Triangle #%d\n",ct++);
		if(c != -1 && (a >= c || b >= c)){
			printf("Impossible.\n\n");
		}else{
			if(a == -1) printf("a");
			else if(b == -1) printf("b");
			else printf("c");
			printf(" = %.3f\n\n",res);
		}
	}
}

아하. 조건을 하나 빼먹었네요. c 역시 -1 이 되었을 때 이를 검출하는 조건이 없어, 이전 코드에서 정답 판정을 받지 못 했던 것 같습니다. 조건이 까다롭고 많은 것은 실수든 아니든 놓치기가 쉽죠. 이런 문제일 수록 손으로 먼저 모든 조건을 나열한 다음에 조건문 작성을 시작해야 합니다. 또한, if else 로 구분한다고 할지라도 else if 를 최대한 많이 직접적으로 써보는 것이 오답률을 줄일 수 있는 방법입니다. 이 문제에는 안 어울리지만 이런 식으로도 작성할 수 있겠죠. 

if(a == -1){
	res = sqrt(c*c-b*b);
}else if(b == -1){
	res = sqrt(c*c-a*a);
}else if(c == -1){
	res = sqrt(a*a+b*b);
}else {
	res = sqrt(a*a+b*b);
}

이 경우 아래 두 조건은 동일하지만, 다른 문제의 경우에는 보다 직관적으로 조건 문이 확인할 수 있기 때문에 오답률을 줄일 수가 있습니다. 

 

이상입니다. 

반응형