문제
대학생 새내기들의 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#언어로 번역하기만 하면 됩니다.
앞으로는 위와같은 방식으로 두 가지 코드를 기본으로 올리고, 문제가 어려울 경우에 다른 분들의 코드와 비교해보는 내용까지 포함해서 글을 작성하겠습니다.
출력
아주 잘 작동합니다!