본문 바로가기

Coding Tests/백준 온라인

( C ) 백준온라인 1546번

<문제>https://www.acmicpc.net/problem/1546

 

<정답 코드>

#include<stdio.h>
int main(void) {
	int score[1000];
	int num;
	int max = 1;
	double newscore[1000];
	double sum = 0;
	scanf("%d", &num);
	for (int i = 0; i < num; i++)
	{
		scanf("%d", &score[i]);
		if (max < score[i])
			max = score[i];
	}
	for (int j = 0; j < num; j++) {
		newscore[j] = (double)score[j] / (double)max * 100;
		sum += newscore[j];
	
	}
	printf("%.2lf", sum / num);
	return 0;

}

 

 (double) score [j] / (double) max * 100; 의 코드는 아래와 같이 작성하여도 된다.

 

(double) score [j]/max*100;으로 적어도 형 변환이 된다.

 

max값을 구하려고 이문제에서 점수 값이 가질 수 있는 가장 작은 수인 1을 max값의 초기값으로 설정하였고 이보다 더 큰 수를 찾는 방식으로 max값을 구해주었다.


 

<절대 오차 상대오차>

 

마지막 출력에서. 2lf로 출력을 하면 정답이겠구나를 알았는데, 그냥 lf로 코드를 작성하여도 정답이 된다.

lf로 출력을 요청하면 소수점 아래 기본 6자리로 출력 결과가 나타나기 때문이다.

 . 1lf ,. 3lf로 출력을 해도 모두 정답처리가 된다. 이와 유사한1008번 문제는 10^-9 이하의 오차범위 이하이면 정답인데,

10^-10과 같이 오차범위가 증가하면 정답으로 인정되지만, 10^-8(. 8lf)은 오답처리가 된다. 이 부분은 1546번도 동일한 조건이라 생각하는데,. 1lf가 정답처리가 되는 이유는 나의 기준에서는 조금 의아한 것 같다. 문제를 푸는 데에 지장이 있는 것은 아니지만, 위와 같은 생각이 들었으니 조금 더 생각해 봐야겠다.


 

<백준 1008번>

https://www.acmicpc.net/problem/1008
https://keep-going99.tistory.com/84