백준 1546번
세준이는 기말고사를 망쳤다.
세준이는 점수를 조작해서 집에 가져가기로 했다.
일단 세준이는 자기 점수 중에 최댓값을 골랐다.
이 값을 M이라고 한다.
그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학 점수가 50이었으면 수학 점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때 새로운 평균을 구하는 프로그램을 작성하시오.
** 절대오차/상대오차를 10^-2까지 허용한다. (+-1%)
#include <stdio.h>
int main()
{
int Count, b=0, arNums[1000]={0,};
double result;
scanf("%d", &Count);
for(int i=0; i<Count; i++){
scanf("%d", &arNums[i]);
if(b < arNums[i]){
b=arNums[i];
}
}
for(int i=0; i<Count; i++){
result+=arNums[i];
}
result= result/Count/b*100;
printf("%lf\n", result);
}
문제를 해결하기 위해선 시험 결과의 총점수와 최대 점수, 과목수가 필요하다.
b변수가 배열내에 저장된 값 중 가장 큰 값을 받는다.
처음 작성한 코드는 첫 반복문에서 b의 값을 초기화하지 않고 다음 루프에서 받았다.
이중으로 감싼 반복문이었는데 잘못된 연산으로 b가 0으로 초기화되었고, 이로 인해 #INF00(INFINITE)라는 결과가 출력되었다.
#INF00(INFINITE)는 float형에서 값을 0.0으로 나누는 경우에 발생하는 일종의 오류라고 한다.
결과 값을 가지는 result 변수는 오차 범위를 줄이기 위해 double형으로 선언했으나 float형으로 작성해도 문제없다.
소수점 6자리까지만 출력하는 문제이기 때문에 아주 약간의 차이만 있으며, 예제 입력 8의 출력 결과가 0.000001 차이 난다.
(최대 자리인 %.15lf로 출력하면 더 많은 차이를 보인다.)
오차범위를 허용하는 문제는 처음 풀어봤는데 정밀도를 높이기 위해선 double형 변수를 사용하는 게 더 좋을 것 같다.
'컴퓨터 > C, C++' 카테고리의 다른 글
[C/C++] 백준 4344번 C언어 (0) | 2022.05.17 |
---|---|
[C/C++] 백준 8958번 C언어 (0) | 2022.05.17 |
[C/C++] 백준 2577번 C언어 (0) | 2022.05.14 |
[C/C++] 백준 3052번 C언어 (0) | 2022.05.14 |
[C/C++] 백준 2562번 배열_최댓값 (0) | 2022.03.18 |
댓글