모름

 

4344번: 평균은 넘겠지

문제 대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다. 입력 첫째 줄에는 테스트 케이스의 개수 C가 주어진다. 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다. 출력 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자

www.acmicpc.net

문제

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

 

코드

using System;

class Program {
    static void Main(string[] args)
    {
        //(1)첫째줄에 테스트 케이스의 개수를 입력받아야한다.
        int c = int.Parse(Console.ReadLine());
        //(5)마지막으로 반복문을 둘러줍니다.
        for (int i = 0; i < c; i++)
        {
            //(2)둘째줄부터 테스트케이스마다 학생의 수가 주어지고 학생의 점수가 주어진다.
            // - 학생의 수를 입력받고
            // - 각 학생의 점수를 입력받는다
            // - 배열로 둘째 줄 입력을 받고 [0]번 값이 학생의 수다
            // - [0]번 값만큼 []이 늘어난다.
            
            //(4)글로 적은 순서대로 C#언어로 차근차근 풀어씁니다.
            string[] input = Console.ReadLine().Split(' ');
            int studentNum = int.Parse(input[0]);
            int[] inputNum = new int[studentNum + 1];
            float sum = 0;
            float average = 0;

            for (int j = 0; j < studentNum + 1; j++)
            {
                inputNum[j] = int.Parse(input[j]);
                if (j >= 1)
                {
                    sum += inputNum[j];
                }
            }

            average = sum / (float)studentNum;
            float count = 0;

            for (int j = 0; j < studentNum + 1; j++)
            {
                if (j >= 1 && inputNum[j] > average)
                {
                    count++;
                }
            }

            float result = count / (float)studentNum;

            Console.WriteLine("{0:#0.000%}", result);

            //(3)평균을 구해야한다
            //[++]값을 모두 더한다
            //[0]번값으로 나눈다
            //나눈값'을 가지고 [1]~[end]까지 나눈값보다 점수가 높은 학생을 찾아낸다.
            //평균보다 높은 점수의 학생 수를 전체 학생의 수로 나눈다.
            //나눈값에 *100을 해주고 소수점 셋째자리 숫자까지 표현하여 출력한다.
            //출력 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
        }
    }
}

이번 문제도 크게 어렵지 않습니다. 제가 코딩한 순서는 주석앞에 번호를 달아놨습니다.

 

이번에는 조금 다른 방식으로 풀었습니다. 지금까지 알고리즘 문제 중 여러 개의 테스트케이스를 받는 경우 전체 케이스를 상대로 문제를 풀 생각을 했었습니다.

 

하지만 이번에는 단지 첫 줄에 받는 입력과 첫 줄에 받는 출력에만 집중했습니다. 즉, 모든 케이스의 경우로 생각을 하는게 아니라 한가지 테스트케이스에 집중해서 문제를 풀었습니다. 그리고 마지막에 테스트케이스만큼의 for문을 둘러주기만했습니다.

 

문제푸는 방식도 다르게 해보았습니다. 우선 문장으로 문제를 풀 수 있는지 적습니다. 그리고 적은 문장(사고의 흐름)이 올바르다면 코딩을 시작합니다.

 

즉, 코딩을 완성하기 전에 아래와 같은 주석이 나와야합니다.

using System;

class Program {
    static void Main(string[] args)
    {
        //첫째줄에 테스트 케이스의 개수를 입력받아야한다.

        //둘째줄부터 테스트케이스마다 학생의 수가 주어지고 학생의 점수가 주어진다.
        // - 학생의 수를 입력받고
        // - 각 학생의 점수를 입력받는다
        // - 배열로 둘째 줄 입력을 받고 [0]번 값이 학생의 수다
        // - [0]번 값만큼 []이 늘어난다.

        //평균을 구해야한다
        //[++]값을 모두 더한다
        //[0]번값으로 나눈다
        //나눈값'을 가지고 [1]~[end]까지 나눈값보다 점수가 높은 학생을 찾아낸다.
        //평균보다 높은 점수의 학생 수를 전체 학생의 수로 나눈다.
        //나눈값에 *100을 해주고 소수점 셋째자리 숫자까지 표현하여 출력한다.
        //출력 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
    }
}

그리고 남은 일은 그저 위 한글을 C#언어로 번역하기만 하면 됩니다.

 

앞으로는 위와같은 방식으로 두 가지 코드를 기본으로 올리고, 문제가 어려울 경우에 다른 분들의 코드와 비교해보는 내용까지 포함해서 글을 작성하겠습니다.

출력

아주 잘 작동합니다!