[백준] 4344번 평균은 넘겠지
import java.io.*;
import java.util.StringTokenizer;
public class Problem4344 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
//테스트케이스 수 받기
int cnt = Integer.parseInt(br.readLine());
//입력받은 테스트케이스 수만큼 반복문 수행
for(int i=0; i<cnt; i++){
//입력한 내용을 StringTokenizer객체로 저장
st = new StringTokenizer(br.readLine());
//첫 번째 값은 학생의 수로 저장하고 그 크기의 배열을 만들어줌
int students = Integer.parseInt(st.nextToken());
int[] scores = new int[students];
int avg = 0;
double overAvg = 0.0;
//점수인 나머지값을 배열에 넣고, 평균을 구하기 위해 합계값을 구함
for (int j=0; j<students; j++){
int score = Integer.parseInt(st.nextToken());
scores[j] = score;
avg += score;
}
//총합계를 학생수로 나눠 평균점수 계산
avg /= students;
//scores 배열에 평균점수보다 높은 점수를 받은 학생의 수를 구함
for(int j=0; j< scores.length; j++){
if(scores[j]>avg) {
overAvg++;
}
}
//평균 점수보다 높은 학생의 수를 전체 학생의 수로 나눈 뒤 100을 곱하여 비율을 구함
System.out.printf("%2.3f%%\n", overAvg/students*100);
}
br.close();
}
}
전 글에서 적은 것처럼 백준 문제를 단계별로 풀고 있다. 첫문제는 크게 생각하지 않고 암산으로 슉슉 풀다가도 가장 마지막 문제는 직접 글로 순서를 적어보고 나서야 문제가 풀리는 걸 보면 각 항목별로 마지막 문제가 가장 어려운 문제인가보다. 이번 문제는 순서대로 쪼개보면 다음과 같다.
1. 테스트 케이스의 수를 입력 받는다.
2. 입력받은 테스트 케이스의 수만큼 반복문을 수행한다.
3. StringTokenizer로 학생의 수를 구한다.
4. 학생의 수만큼 반복문을 수행한다.
5. StringTokenizer의 nextToken으로 점수를 구하고 이를 scores배열에 저장한다. 동시에 점수를 avg에 저장한다.
6. avg값을 학생의 수로 나눠 평균값을 구한다.
7. scores배열의 길이만큼 반복문을 수행한다.
8. 배열내부의 값이 평균값보다 크다면 overAvg에 1 추가한다.
9. 평균점수보다 높은 학생의 수(overAvg)를 전체 학생의 수로 나눈 값에 100을 곱해 평균보다 높은 점수를 받은 학생의 백분율을 구한다.
사용한 변수들이 지저분해보이고 반복문을 여러 번 사용하는 것이 만족스럽지 않지만 지금의 나에게 이외에 다른 방법이 떠오르지 않는다. StringTokenizer와 BufferedReader를 사용하는 것은 익숙해지고 있다. 마지막에 출력하는 데 BufferedWriter를 써야하나 고민했지만 원하는 출력값이 나오지 않아 그냥 printf를 이용했다. 실수형 타입을 사용할 때 float는 f, double은 d를 붙이는 게 생각나서 실수형 포맷을 어떻게 입력해야하나 고민하다 검색했다. 여긴 자료형과 관계없이 정수형 %d, 실수형 %f였다(머쓱). 이걸로 끝난 줄 알고 그냥 %를 입력했다가 오류가 발생했다. \를 입력하고싶을 때 \\를 입력해야 하는 것처럼 %를 입력하려면 %%를 입력해야 했다. 이것도 검색을 통해 알았다(다시 머쓱).