Algorithm

[Java] 백준 4344 평균은 넘겠지

isaac.kim 2022. 4. 25.
728x90
반응형

[Java] 백준 4344 평균은 넘겠지

 

백준 사이트에서 Java 언어로 [문제 4344 평균은 넘겠지]를 푼 과정 포스팅.

 

구글이나 네이버에 백준을 검색하면 해당 사이트를 확인할 수 있다. 그리고 상단 메뉴에서 [문제 > 단계별로 풀어보기]를 진행하면 만날 수 있는 문제이다.

 

문제는 다음과 같다.

 

 

다음은 문제에 대한 상세 입출력 설명이다.

 

 

예제 입력과 출력은 다음과 같다.

 

 

 

 

 

문제를 풀면서 주의할 점은 결괏값을 도출해내는 것과 포맷 형식도 똑같이 맞춰야 한다. 처음에 포맷 형식을 맞추지 않아서 틀렸었다. 예를 들면 위 예제 출력에서 40.000% 출력을 해야 하는데 40.0를 출력하면 틀린 것이다. (본인이 그랬음..)

 

 

문제 풀이

먼저 문제에 대해 분석한다.

 

Java에서 입력은 BufferedReader, Scanner 두 개를 사용하고 있는데, BufferedReader가 속도가 조금 더 빠르다. 하지만 코드가 간결해 보이는 게 좋아서 Scanner 클래스를 사용하는 것을 선호한다. 일단 중요한 것은 간단한 문제 풀어가는 입장에서 큰 차이를 못 느낀다.

 

Scanner sc = new Scanner(System.in);

 

입력 기초 작업은 다음과 같다.

 

케이스 수를 입력받고, 각 케이스에서 N명의 사람과 그들의 점수를 입력받는다.

int c = sc.nextInt(); // case의 수 입력받기

 

 

이중 for문을 사용해 각 케이스에서 사람의 수 N과 N개의 점수를 입력받는 코드를 작성한다.

for( int i = 0; i < c; i ++ ) {
    int n = sc.nextInt();
    int[] scores = new int[n];

    for (int j = 0; j < n; j++) {
        scores[j] = sc.nextInt();
    }
}

위 코드를 설명을 더 하자면, 먼저 케이스의 수 만큼 반복을 하고, 그 안에서 n명의 사람의 수를 입력받고, 다음 이중 포문으로 n명의 점수를 입력받는다.

 

 

케이스 마다 바로 평균을 구해서 평균 이상자 수를 구하고, N명 중에 몇 퍼센트인지 구하는 코드를 추가하였다.

// 입력
int c = sc.nextInt();
double[] res = new double[c]; 

// 라인 수 만큼 반복
for( int i = 0; i < c; i ++ ) {
    int n = sc.nextInt();
    int[] scores = new int[n];
    double avg = 0;
    for (int j = 0; j < n; j++) {
        scores[j] = sc.nextInt();
        avg += scores[j];
    }
    avg = avg / n;	// 평균

    // 평균이상자
    int avgUp = 0;
    for (int k = 0; k < n ; k++) if (scores[k] > avg) avgUp++; 

    res[i] = Math.round( (double)avgUp / (double) n * 100.0 * 1000) / 1000.0;
}

소숫점 넷째자리에서 반올림을 하고, 셋째자리까지 출력하기 위해 다음과 같이 코드를 작성했다.

res[i] = Math.round( (double)avgUp / (double) n * 100.0 * 1000) / 1000.0;

결과의 출력과 Scanner 객체를 소멸시키며 코드는 마무리된다.

for(int pt = 0; pt < c; pt++) {
    System.out.printf("%.3f%%\n", res[pt]);
}

sc.close();

Java Format 출력에서 퍼센트 출력은 %%, 내려쓰기는 \n 로 출력한다.

 

 

 

전체 소스코드

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		// 입력
		int c = sc.nextInt();
		double[] res = new double[c]; 
		
		// 라인 수 만큼 반복
		for( int i = 0; i < c; i ++ ) {
			int n = sc.nextInt();
			int[] scores = new int[n];
			double avg = 0;
			for (int j = 0; j < n; j++) {
				scores[j] = sc.nextInt();
				avg += scores[j];
			}
			avg = avg / n;	// 평균
			
			// 평균이상자
			int avgUp = 0;
			for (int k = 0; k < n ; k++) if (scores[k] > avg) avgUp++; 
			
			res[i] = Math.round( (double)avgUp / (double) n * 100.0 * 1000) / 1000.0;
		}
		
		for(int pt = 0; pt < c; pt++) {
			System.out.printf("%.3f%%\n", res[pt]);
		}
		
		sc.close();
	}
}

 

출력 결과


도움이 되셨다면 광고 꾹! 해주시면 제게 큰 힘이 된답니다!^^

728x90
반응형

'Algorithm' 카테고리의 다른 글

[Java] 백준 4673 - 셀프 넘버  (0) 2022.04.25
[Java] 백준 15596 - 정수 N개의 합  (0) 2022.04.25
[Java] 백문 문제 8958 - OX퀴즈  (0) 2022.04.23
[Java] 백준 문제 1546 평균  (0) 2022.04.23
[Java] 백준 문제 3052 - 나머지  (0) 2022.04.21