반응형
https://www.acmicpc.net/problem/1546
1546번: 평균
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보
www.acmicpc.net
코드
#include <stdio.h>
#include <stdlib.h>
int main() {
int N;
float *score;
int M = 0;
float sum,ave = 0;
scanf("%d",&N);
score = (float*)malloc(sizeof(float) * N);
for(int i = 0; i < N; i++) {
scanf("%f",&score[i]);
if(M < score[i]) {
M = score[i];
}
}
for(int i = 0; i < N; i++) {
score[i] = score[i] / M * 100;
sum += score[i];
}
ave = sum / N;
printf("%f",ave);
return 0;
}
☞ 풀이 전
N값이 반드시 배열의 크기가 되어야 하기 때문에 동적할당이 필요하다고 생각했습니다. 배열을 float형으로 한 이유는 1.굳이 부동소수점을 표현할 필요가 없다고 생각하여 double을 쓰지 않았고 2.문제에서 제시한대로 나눗셈을 거쳐서 소수점을 살려야 하기 때문이다. sum과 ave도 score 변수로 구성된 식이기 때문에 같은 float형으로 선언해줬다.
☞ 왜?
동적할당과 실수형으로 변수들을 선언해줬다면 나머지는 문제의 조건을 따라 식을 구성하기만 하면 되는 문제였다.
그러나 문제에서 궁금증이 생겼다. "실제 정답과 출력값의 절대오차 또는 상대오차가 10^-2 이하이면 정답이다."라는 조건은 왜 있던 걸까?
☞ 다른 사람의 코드
#include <stdio.h>
int main() {
int n, score, big = 0;
double sum = 0;
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
scanf_s("%d", &score);
sum += score;
if (big < score)
big = score;
}
printf("%lf", (sum / big * 100) / n);
return 0;
}
출처 : https://velog.io/@chunghanoo/C%EC%96%B8%EC%96%B4-%EB%B0%B1%EC%A4%80-1546%EB%B2%88-%ED%8F%89%EA%B7%A0
굳이 동적할당으로 배열을 선언하지 않아도 좋았다. 위의 궁금증에 대해서는 더 알아볼 생각이다.
반응형
'Baekjoon' 카테고리의 다른 글
[C] 백준 4344번 : 평균은 넘겠지 (0) | 2023.01.04 |
---|---|
[C] 백준 8958번 : OX퀴즈 (1) | 2022.09.08 |
[C] 백준 3052번 : 나머지 (0) | 2022.08.16 |
[C] 백준 2439번 : 별 찍기 - 2 (0) | 2022.08.13 |
[C] 백준 15552번 : 빠른 A+B (0) | 2022.08.12 |