[BOJ/1046/C++] 평균

SHark·2023년 3월 6일
0

BOJ

목록 보기
16/59

출처:https://www.acmicpc.net/problem/1546

문제

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M100으로 고쳤다. 예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70100이 되어 71.43점이 된다. 세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성 하시오.

조건

  • 첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

SOL

반복문을 여러개 써도 되는 문제이지만, 줄일 수 있는 방법이 없을까하면서, 고민하는데 꽤 걸린 문제이다. 반복문을 여러개 쓴다면, 입출력을 받고 -> max값을 구하고 -> 각각의 원소에 max값을 나눠주고 곱한 값을 더해주고 -> 마지막에 출력

이렇게 해줄 수 있지만,C++의 형변환 때문에 생각보다 귀찮은 작업이 될 수 있다. 그러므로, 살짝 수학적으로 의미가 같게 바꿔서 계산을 해보았다.

10max+20max+30max...=(10+20+30...)1max\frac{10}{max}+\frac{20}{max}+\frac{30}{max}...=(10+20+30...)*\frac{1}{max}이다. 즉, 합을 먼저해주고 나중에 맥스 값을 나눠줘도 상관이 없다.

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int N;
  double sum = 0;
  int max = 0;
  cin >> N;
  int score[1001] = {};

  for (int i = 0; i < N; i++)
  {
    cin >> score[i];
    if (score[i] > max)
      max = score[i];
    sum += score[i];
  }
  sum = (sum / max * 100) / N;
  cout << sum << '\n';
  return 0;
}

0개의 댓글