자료구조-알고리즘 공부

[구름LEVEL]시험성적 평균과 등급 구하기

Anul 2021. 9. 8. 22:41
문제 소개

3개의 정수형인 점수들을 입력받아 평균을 내고, 100점부터 10점 단위로 차등하여 등급을 매기는 것이 목적이다. 

[구름LEVEL] 시험성적 평균과 등급 구하기

 

#include <stdio.h>
int main() {
	//점수 입력
	int korean,math,eng = 0;
	scanf("%d %d %d", &korean,&math,&eng);
	//평균 계산 및 출력
	int sum = korean+math+eng;
	double ave = sum/3.0;
	//소수점 3번째 자리에서 반올림처리
	ave += 0.005;
	ave *= 100;
	int ave_tmp = ave;//묵시적 형변환(double -> int)
	ave = ave_tmp/100.0;//묵시적 형변환
	printf("%0.2lf ",ave);
	//등급 계산 및 출력
	int ave_int = ave/10;
	switch(ave_int){
		case 10:
			printf("A");
			break;
		case 9:
			printf("A");
			break;
		case 8:
			printf("B");
			break;
		case 7:
			printf("C");
			break;
		case 6:
			printf("D");
			break;
		default:
			printf("F");
	}
	return 0;
}

이번 문제의 핵심은 '반올림'이라고 생각한다. 반올림 기능을 구현하는 것이 이 문제의 핵심요소였다. 비록 별 1개짜리 문제이지만 저 반올림을 어떻게 구현할까 생각하는 데에 시간을 좀 쏟았다. 

 

오늘 배운 것

1. C언어에서는 반올림 함수가 없다. 어떻게 구현할까

사실 math.h를 include하면 roundf()함수를 통해 반올림을 할 수 있기는 하다. 다만 나는 공부가 목적이니, 이 math헤더 없이 구현해본 것이다.

위의 본문에서는 소수점 3번째 자리에서 반올림을 한다. 그럼 0.005를 더해서 소수점 세 번째 자리가 10을 넘어갈 기회를 준다. 예를 들어 0.003이었다면 0.005를 더해봤자 0.008이어서 소수점 두 번째 자리에는 변화를 주지 못한다. 반면 0.007등의 숫자였다면 0.005를 더했을 때 0.012가 되어 소수점 두 번째 자리에 변화가 생긴다. 이를 이용하는 것이다.

 

<소수점 세 번째 자리에서 반올림하고싶다!>

-반올림시 버림 되는 경우

0.333(반올림했을 때 내림 되는 수) + 0.005 = 0.338(소수점 두 번째 자리에 변화 없음)

0.338 * 100 = 33.8

int(33.8) = 33

33/100 = 0.33 ->반올림하여 버림 처리됨

 

-반올림시 올림 되는 경우

0.666(반올림했을 때 올림 되는 수) + 0.005 = 0.671(소수점 두 번째 자리에 변화 있음)

0.671 * 100 = 67.1

int(67.1) = 67

67/100 = 0.67 ->반올림하여 올림 처리됨