상세 컨텐츠

본문 제목

백준 1546번 평균 c

알고리즘/C

by 초띠 2023. 4. 9. 01:12

본문

이 문제는 세준이의 원래 기말고사 점수 중에서 가장 큰 점수로 다른 점수들을 나누고 100을 곱해준 다음 그 점수들의 평균을 구하는 문제입니다. 
 

#include <stdio.h>
#include <string.h>

int main() {
  double N;
  double max=0;
  double sum = 0;
  double ave = 0;
  double sc[10882];

  scanf("%lf", &N);

마지막에 출력값이 실수형이기 때문에 계산의 편리함을 위해 변수들의 자료형을 double로 통일했습니다. N은 시험 본 과목의 개수, max는 그 중 가장 잘 본 과목의 점수입니다. sum은 다른 과목 점수에 최대 점수로 나눈 후 100을 곱한 값들의 합을 저장할 것입니다. ave는 마지막에 출력할 새로운 점수들의 평균이고, sc(score의 줄임) 배열에는 각 과목의 점수를 입력받을 것입니다. 
 
변수들을 이렇게 만들고, 과목의 개수를 입력받습니다.
 

  for(int i = 0; i < N; i++){
    scanf("%lf", &sc[i]);
    if(sc[i] > max){
      max = sc[i];
    }
  }

이 부분은 시험 본 과목의 개수만큼 점수를 입력받고, 그 중 최대점수를 max에 대입하는 코드입니다.
for문 안에서 max의 값과 새로 입력된 점수를 계속 비교하여 최대 점수를 정합니다.
 

  for(int i = 0; i < N; i++){
    sc[i] = sc[i]/max*100.0;
    sum += sc[j];
  }

또 다른 for문으로 앞에서 입력받은 점수들을 최대점수로 나누고 백을 곱해줍니다. 그리고 sum에 각 결과들의 합을 저장합니다.
 

  ave = sum/N;

  printf("%.2lf", ave);
  
  return 0;
}

그러면 ave는 sum을 N으로 나눈 값이 되고, 출력해주면 프로그램이 종료됩니다.
 
 
사실 배열을 선언할 때 char말고 다른 자료형으로 선언해 본 적이 없어서 double이나 int도 가능한지 몰랐습니다.
 
코드를 다 짜고 제출했을 때 자꾸 런타임에러(outofbounds), 런타임에러(segfault)가 나왔었는데 원인이 sc배열의 범위 문제였습니다. 문제에서 점수의 값이 100보다 작거나 같은 정수라고 해서 101으로 하면 작다고 하고 그렇다고 99999999999처럼 너무 많아도 초과된다고 해서 적당하게 아무 숫자나 넣었더니 정답이 되었습니다. 
 
10의 -2승 이하의 오차를 허용한다고 정확히 소수 2번째 자리까지 출력하라는 뜻은 아니라고 했지만 2번째 자리까지 출력하는게 안전하다고 생각해서 2번째 자리까지 출력하도록 했습니다.
 

관련글 더보기