문제 풀이/[JAVA_자바] 백준

[JAVA / 자바] 백준 4344번 - 평균은 넘겠지

Seunghyun_KO 2021. 12. 9. 09:00
728x90
반응형

문제

대학생 새내기들의 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째자리까지 표현이므로 실수형 포멧형식 사용
        }
    }
}

코드 실행 결과


후기

연산 시 형 변환도 하고 출력도 포맷 형식을 이용해서 출력하는 등의 알아두면 나중에 문제 풀 때 또 분명히 나올만한 포인트들이 있다. 형 변환과 출력 포맷 형식은 꼭 알아두어야 할 내용이라 생각이 든다. 문제의 난이도 자체는 높지 않았다는 생각이 드나, 아마 정답 비율이 낮은 이유는 비율을 따질 때 형 변환을 잘못하거나 안 해서 많이 오답이 나왔기 때문이 아닐까라는 개인적인 생각이 든다.


문제 원본

https://www.acmicpc.net/problem/4344

728x90
반응형