문제
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.
입력
첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
출력
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
문제 접근 방법
그 반의 평균을 구한 후에 다시 그 반 학생들의 점수와 비교해서 평균 이상 인 학생의 수를 구해야 하므로 리스트에 학생들의 점수를 저장해놓아야 한다. 이때, 테스트 케이스가 1개가 아니라 여러 개이므로 매 케이스마다 리스트를 새로 만들 수는 없으니 최대로 올 수 있는 학생의 수인 1000의 크기를 가진 리스트를 하나 미리 생성해 둔다.
주의해야 할 점으로는 int형끼리의 연산으로는 소수점이 절대 나올 수 없다. 따라서 반에 평균 이상의 점수를 가진 학생들의 비율을 계산해줄 때에는 double형으로 형 변환을 해서 계산을 해주어야 소숫값이 나오기 때문에 이를 주의해주면 될 것이고, 소수점 셋째 자리까지 출력한다 되어있으므로 출력 포맷 형식을 사용하여 셋째 자리까지만 출력이 되게 하면 될 것이다.
JAVA 코드 풀이
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner input = new Scanner(System.in);
int testNum = input.nextInt(); // 테스트 케이스 갯수를 입력받는다
int num, total, top;
int temp[] = new int[1000]; // 최대 1000명의 학생이 입력될 수 있으므로 크기는 1000으로 잡는다
double avg;
for(int i=0; i<testNum; i++){
num = input.nextInt(); // 학생 수
total = 0; // 총 합, 평균 넘는 학생 수 초기화
top = 0;
for(int j=0; j<num; j++){
temp[j] = input.nextInt(); // 학생 점수 입력
total += temp[j]; // 학생 점수 총 합
}
avg = total/num; // 학생 점수 평균
for(int j=0; j<num; j++){
if(avg < temp[j]) // 평균이 넘는 학생 수 카운트
top++;
}
System.out.printf("%.3f%%\n", (double)top/num*100); // double형으로 형변환 하여 계산, 소수점 3째자리까지 표현이므로 실수형 포멧형식 사용
}
}
}
후기
연산 시 형 변환도 하고 출력도 포맷 형식을 이용해서 출력하는 등의 알아두면 나중에 문제 풀 때 또 분명히 나올만한 포인트들이 있다. 형 변환과 출력 포맷 형식은 꼭 알아두어야 할 내용이라 생각이 든다. 문제의 난이도 자체는 높지 않았다는 생각이 드나, 아마 정답 비율이 낮은 이유는 비율을 따질 때 형 변환을 잘못하거나 안 해서 많이 오답이 나왔기 때문이 아닐까라는 개인적인 생각이 든다.
문제 원본
'문제 풀이 > [JAVA_자바] 백준' 카테고리의 다른 글
[JAVA / 자바] 백준 1157번 - 단어 공부 (0) | 2021.12.13 |
---|---|
[JAVA / 자바] 백준 4673번 - 셀프 넘버 (0) | 2021.12.10 |
[JAVA / 자바] 백준 1546번 - 평균 (0) | 2021.12.08 |
[JAVA / 자바] 백준 2562번 - 최댓값 (0) | 2021.12.07 |
[JAVA / 자바] 백준 10818번 - 최소, 최대 (0) | 2021.12.06 |