https://www.acmicpc.net/problem/4344
문제
> 대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다.
> 당신은 그들에게 슬픈 진실을 알려줘야 한다.
접근
매 테스트 케이스마다 주어진 N명을 크기로 하는 배열을 만들어 점수를 저장하며 이 점수들을 전부 누적해 N을 나눠 동시에 평균까지 구해버린다.
이제 배열을 순환하며 평균보다 낮은 학생의 수를 누적하고 전체 학생 수 로 나눠 비율을 구해낸다.
문제해결
> 테스트 케이스의 수를 C에 입력받아 저장하고 C번 while문으로 각 케이스를 처리한다.
> 학생수 N을 입력받고 이를 크기로 점수 배열 score을 선언한다.
> 실수형 점수의 합과 평균을 담을 변수 sum과 avg를 선언한다.
> 학생 수 만큼 반복하며 배열에 점수를 담으면서 sum에 점수를 누적한다.
> 이 과정이 끝나면 바로 학생 수로 sum을 나눠 평균을 구한다.
> 이제 배열의 원소를 순회하며 평균을 초과하는 점수를 가진 학생의 수를 cnt에 누적한다.
> 출력을 한번에 하기 위해 stringbuilder에 출력형식을 소수점 아래 셋째 자리까지 format하여 저장한다.
> %.3f로 실수형 소수점 아래 세자리, %는 포맷문자이기 때문에 %%로 이스케이프 해주어 %를 출력하고 줄바꿈도 추가해준다.
> 이 format형식으로 비율이므로 cnt * 100.0을 곱해 실수로 변환해주고 학생 수 N으로 나눠 구해준다.
코드
import java.io.*;
import java.util.*;
import java.lang.*;
public class Main
{
//4344번 평균은 넘겠지
static int C, N;
static int[] score;
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
C = Integer.parseInt(br.readLine());
while(C-->0)
{
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
score = new int[N];
double sum = 0, avg;
for(int i = 0; i < N; i++) sum += score[i] = Integer.parseInt(st.nextToken());
avg = sum / N;
int cnt = 0;
for(int i : score) if(i > avg) cnt++;
sb.append(String.format("%.3f%%\n", cnt * 100.0 / N));
}
System.out.print(sb);
}
}

후기
형식 지정자의 역할과 기능, 어떻게 쓰는지를 자세히 알아보는 좋은 문제였다.