https://www.acmicpc.net/problem/1546
문제
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
출력
첫째 줄에 새로운 평균을 출력한다. 정답과의 절대/상대 오차는 10-2까지 허용한다.
코드
using System;
class Program {
static void Main()
{
//첫쨰 줄에 시험 본 과목의 개수
int n = int.Parse(Console.ReadLine());
//둘째 줄에 세준이의 성적이 주어진다.
string[] inputScore = Console.ReadLine().Split(' ');
float[] score = Array.ConvertAll(inputScore, float.Parse);
//자기 점수 중 최댓값을 골라내야한다.
float maxScore = float.MinValue;
for (int i = 0; i < n; i++)
{
if (maxScore < score[i])
{
maxScore = score[i];
}
}
//새로운 평균을 구해야한다.
// - 반복문을 돌면서 원래점수를 조작한점수로 변경해야한다.
// - 조작한 점수를 모두 더한다.
// - 모두 더해진 점수를 나누어서 새로운 평균을 만든다.
float sum = 0;
for (int i = 0; i < n; i++)
{
score[i] = (score[i] / maxScore) * 100;
sum += score[i];
}
double scoreAverage = sum / n;
//첫째 줄에 새로운 평균을 출력한다.
Console.WriteLine("{0:#0.00####}", scoreAverage);
}
}
이번 문제는 복잡한 문제는 아니었다. 주석에 설명된대로 차근차근 풀면 쉽게 풀린다. 단, 몇몇 부분에서 막혔었는데 그 부분을 짚고 넘어갈까한다.
첫번째로 int, float, double형을 잘 써야했다. 처음엔 점수를 받을때 int형으로 받아서 중간에 평균구하는 부분에서 계산이 안됐었다. 처음엔 코드가 잘못됐나싶었는데, 알고보니 int형으로 계산을 해서 소수점 이하 자리가 짤려서 값이 이상하게 나왔었다.
두번째로 출력조건을 살펴보면 절대/상대 오차 10-2승까지 허용한다고나온다. 백준 단계별로 풀기 사칙연산 이후로 오랜만에 보는 절대/상대오차인데, 소수점 2자리까지는 값이 같아야한다는 의미다. 참고로 float은 소수점 유효자리가 6자리까지, double은 소수점 유효자리가 15자리까지표현되는데, 10^-2의 경우 float만으로도 충분히 오차를 커버할수있다.
콘솔실행화면
정상출력완료.
보통 예제를 보고 그대로 따라만드는게 편해서 따라만들었다. 위와같이 출력하려면 String.Format의 숙지가 필요하다. 종종 사용되니 아래 코드를 보고 참고하면된다.
//string.Format을 이용한 2가지 반올림 방법
double value = 5.123456789;
//방법1
string result = string.Format("{0:0.#####0}", value);
//결과값 result = "5.123457"
//7번째 자리의 값을 반올림하여 출력.
//방법2
string result = string.Format("{0:F6}", value);
//결과값 result = "5.123457"
//7번째 자리의 값을 반올림하여 출력.
// 출처 : https://virtualgiraffe.co.kr/15