백준 웹사이트 "1546번 - 평균" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)
문제
소스 코드
#include <stdio.h>
int main(void){
int N;
scanf("%d", &N);
int arr[N];
int max = 0;
for(int i=0; i<N; i++){
scanf("%d", &arr[i]);
if(arr[i] > max)
max = arr[i];
}
double sum = 0; // double 주의
for(int j=0; j<N; j++){
sum = sum + ((double) arr[j]/max)*100; // double 주의
}
printf("%f\n", (double) sum/N); // %f, double 주의
}
문제 풀이
문제 풀이를 크게 두 가지 과정으로 나눌 수 있습니다: 주어진 점수들 중 최댓값을 구하는 과정 (Line 7 ~ 13)이 첫 번째이고, 새로운 점수를 계산하여 평균을 내는 과정 (Line 15 ~ 18)이 두 번째입니다.
첫 번째, 최댓값을 구하는 과정은 이전 문제들과 거의 동일합니다. 2562번 문제가 최댓값을 구하는 문제인데, 궁금한 점이 있다면 아래 백준 웹사이트 "2562번 - 최댓값" 문제풀이 링크를 참고해주시면 되겠습니다.
두 번째, 새로운 점수를 계산하여 평균을 내는 과정이 조금 더 까다롭습니다. Line 16의 for문을 통해 배열에 저장된 수들을 하나씩 불러내어, Line 17과 같이 ((double) arr[j]/max)*100
을 통해 새로운 점수를 계산합니다. 이때 주의할 것은 '(double)'을 반드시 붙이는 것입니다. 'max'가 배열의 요소들 중 최댓값이므로, 'arr[j]/max'는 반드시 1보다 작은 소수가 됩니다. 그러나 arr[j]과 max 모두 int(정수)로 선언되었기에 컴파일러는 arr[j]/max를 int(정수)로 예측을 하고, 1보다 작은 소수이므로 소수점 아래를 버리면 0으로 계산됩니다. 이렇게 소수점 아래의 값을 잃지 않기 위해, (double)을 붙여 소수임을 컴파일러에게 알려줘야 합니다.
새로운 점수들의 평균을 구하기 위해, 새로운 점수들의 합을 구해야 하기에 Line 15의 'sum'을 선언해줍니다. 흔히 사용하는 'int (정수)'가 아닌 'double'로 선언을 하였는데, 이는 Line 17에서 double 값으로 계산되는 새로운 점수들을 계속해서 더해주기 떄문입니다. 이때 sum을 int로 선언한다면, 소수점 아래의 값을 잃게 됩니다. Line 19에서 평균을 구할 때 역시, 정확한 소수 값을 계산하기 위해 '(double)'을 붙여주고, 출력할 때 '%f'를 이용해 출력해줍니다.
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 4344번 - 평균은 넘겠지 (2) | 2022.01.03 |
---|---|
[백준/C언어] 8958번 - OX퀴즈 (0) | 2022.01.02 |
[백준/C언어] 3052번 - 나머지 (0) | 2022.01.01 |
[백준/C언어] 2577번 - 숫자의 개수 (0) | 2021.12.31 |
[백준/C언어] 2562번 - 최댓값 (0) | 2021.12.31 |