STUDY/백준알고리즘

[4344:JAVA] 1차원 배열 > 평균은 넘겠지

bameh 2022. 2. 9. 14:51

[백준알고리즘: 1차원 배열 단계 > 7. 평균은 넘겠지] - JAVA

 

문제

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

 

입력

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

 

출력

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

 

 

 

[풀이방법]

먼저 처리할 순서를 정의한 후 순서에 따라 필요한 값을 구했다.

1) 테스트 케이스의 개수 입력받기

int testCase;

2) for문을 이용하여 테스트 케이스별 학생의 수와 학생의 수만큼 점수 입력받기

for (int j=0; j<cnt; j++){
    point[j] = sc.nextInt();
    sum += point[j];
}

3) 입력받은 값을 이용하여 케이스별 평균 계산하기

double avg = sum/cnt;

4) 평균 점수를 초과하는 학생의 수 구하기

for (int j=0; j<point.length; j++){
    if (point[j] > avg) {
        castCnt++;
    }
}

5) 3)과 4)를 이용하여 평균을 넘는 학생의 비율 구하기

temp[i] = ((castCnt/point.length) * 100)

 

# 전체 코드

public class ch5_7 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int testCase = sc.nextInt();
        double[] temp = new double[testCase];
        double[] avg = new double[testCase];

        // result 개수만큼 학생을 받는다.
        for (int i=0; i<testCase; i++){
            // 학생 수 입력.
            int cnt = sc.nextInt();
            int sum = 0;
            int[] point = new int[cnt];

            // 학생 수 만큼 점수 입력
            for (int j=0; j<cnt; j++){
                point[j] = sc.nextInt();
                sum += point[j];
            }
            // 케이스별 평균
            avg[i] = (float)sum/cnt;

            double castCnt =0;
            for (int j=0; j<point.length; j++){
                if (point[j] > avg[i]) {
                    castCnt++;
                }
            }
            temp[i] = ((castCnt/point.length) * 100);
        }
        for (int i=0; i<testCase; i++){
            System.out.println(String.format("%.3f", temp[i]) + "%");
        }
    }
}

 

 

위의 코드는 순서만 정의해서 작성을 진행했을 뿐, 구체적인 코드 작성은 정리하지 않고 되는대로 작성다.

따라서 한눈에도 불필요한 내용이 매우 많은 것을 확인할 수 있었다.

 

불필요한 변수와 for문을 삭제하고, 한 번에 필요한 값을 출력시킬 수 있도록 수정했다.

수식에 필요한 변수는 double로 선언했으며, 값을 간단하게 출력할 수 있도록 printf를 이용했다.

 

public class ch5_7 {
	public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
        int testCase = sc.nextInt();

        // result 개수만큼 학생을 받는다.
        for (int i=0; i<testCase; i++){
            // 학생 수 입력.
            int cnt = sc.nextInt();
            double sum = 0;
            int[] point = new int[cnt];

            // 학생 수 만큼 점수 입력
            for (int j=0; j<cnt; j++){
                point[j] = sc.nextInt();
                sum += point[j];
            }
            // 케이스별 평균
            double avg = sum/cnt;
            double castCnt = 0;

            for (int j=0; j<point.length; j++){
                if (point[j] > avg) {
                    castCnt++;
                }
            }
        System.out.printf("%.3f%%\n", (castCnt/cnt)*100);
        }
    }
}

 

끝.