모름

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

 

1546번: 평균

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

www.acmicpc.net

문제

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 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

https://blog.edit.kr/entry/String-Decimal-%EC%86%8C%EC%88%98%EC%A0%90-%EC%A7%80%EC%A0%95-StringFromat-%ED%95%A8%EC%88%98%EC%82%AC%EC%9A%A9

 

String Decimal 소수점 지정 = String.Fromat() 함수사용

C#에서 String이나, Decimal에서 소수점 지정하고 (예: 소주점 2째자리까지 자르기등) C# .NET에서 사용하는 Format Specifier를 사용 n은 Argument 위치이며 0부터 시작한다. w는 출력 Width를 가리키며, t는 출..

blog.edit.kr