[★2][백준4344번]평균은 넘겠지 (JAVA)

Date:     Updated:

카테고리:

태그:

[★2][백준4344번]평균은 넘겠지 (JAVA)

4344번 문제 ☞ https://www.acmicpc.net/problem/4344

난이도 ☞ [★2]

평균은 넘겠지

  • 문제
    • 대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.
    • 첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
      둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
    • 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

      예제입력 예제출력
      5
      5 50 50 70 80 100
      7 100 95 90 80 70 60 50
      3 70 90 80
      3 70 90 81
      9 100 99 98 97 96 95 94 93 91
      40.000%
      57.143%
      33.333%
      66.667%
      55.556%

내가 푼 풀이

이번 문제는 오히려 테스트 케이스의 개수 C때문에 더 헷갈릴 수 있으니, 평균을 구하는 코드를 먼저 작성한 후에 그 코드를 for문으로 다시 감싸 테스트 케이스 개수만큼 입력받게 구현하는 것이 어쩌면 쉬울 수도 있다. 여기서 주의해야할 몇몇 가지가 있는데 다음과 같다.

1) 첫번째로 입력 받는 값은 테스트 케이스 갯수라는 것
2) 비율이기때문에 퍼센트(%)로 출력해야 한다는 것
3) 퍼센트출력 시 소수점 세번째짜리까지 출력해야 한다는 것

이 부분만 주의하면 될 것 같다. 이제 풀이를 해보도록 하겠다.

[ 풀이 1 ]

메모리 : 33592KB
시간 : 428ms

Scanner

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);

		int[] arr;

		int C = s.nextInt(); 			// 몇 개의 케이스를 돌려볼 건지

		for (int i = 0; i < C; i++) {
			int N = s.nextInt();		// 학생수 N명을 받음
			arr = new int[N];
			
			double sum = 0; 			// 누적 성적을 받을 함수
			
			for (int j = 0; j < N; j++) {
				int E = s.nextInt(); 	// 성적을 입력 받음
				arr[j] = E;
				sum += E; 				// 입력받은 성적 누적 합계

			}
			double avg = (sum / N); 	// 성적 평균
			double cnt = 0; 			// 평균 넘는 학생 변수

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

Scanner방식은 가장 기본적인 방법이다. 여기서 알아두면 좋을 것이 있다. 소수점 출력 방식과 %를 출력하기 위해서는 %%를 사용한다는 것이 되겠다. printf에서는 %를 출력하려면 %%를 작성해야한다. 그리고 %.3f는 소수점 출력 포맷이며, ‘소수점 셋째짜리까지 출력하겠다.’라고 하는 것이다.

[ 풀이 2 ]

메모리 : 15684KB
시간 : 188ms

BufferedReader

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class NO4344BOJ2 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int[] arr;

		int C = Integer.parseInt(br.readLine()); // 몇 개의 케이스를 돌려볼 건지

		
		for (int i = 0; i < C; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			
			int N = Integer.parseInt(st.nextToken()); // 학생수 N명을 받음
			arr = new int[N];
			
			double sum = 0; 		// 누적 성적을 받을 함수
			

			for (int j = 0; j < N; j++) {
				int E = Integer.parseInt(st.nextToken()); // 성적을 입력 받음
				arr[j] = E;
				sum += E;  // 입력받은 성적 누적 합계

			}
			double avg = (sum / N); // 성적 평균
			double cnt = 0; 		// 평균 넘는 학생 변수

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

StringTokenizer에 공백을 기준으로 구분 된 토큰을 반환시켜 배열에 저장시킨다.’와 소멸 절차가 있기때문에 그에 따라 for문 안에 따로 다시 작성해줘야된다는 정도면 알고 있으면 될 것 같다.

BKJN 카테고리 내 다른 글 보러가기

댓글 남기기