본문 바로가기

알고리즘/백준

[4344]평균은 넘겠지

수행일자 : 2021.08.01


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

 

4344번: 평균은 넘겠지

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

www.acmicpc.net


문제

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

입력

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

출력

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

입출력 예제


BufferedReader 를 사용해서 풀어보려고 한다.

 

선언할 변수들은 다음과 같다.

  • 입력받을 테스트 케이스의 개수 [ C ]
  • 점수를 담을 배열 [  arr ]
  • 둘째 줄에서 학생의 수를 입력받을 변수 [ number ]
  • 합산 금액을 저장할 double 형 변수 [ sum ]
  • 학생들의 점수를 저장할 변수 [ value ]
  • 평균 금액을 저장할 double 형 변수 [ avg ]
  • 평균보다 넘는 학생들의 수를 저장할 double 형 변수 [ cnt ]

먼저 각 변수를 선언하되, 배열의 크기는 바로 알 수 없기 때문에 초기화는 하지 않는다.

StringTokenizer의 경우에도 바로 입력받을 값(토큰)이 없기 때문에 객체화는 하지 않는다.

다음으로는 테스트 케이스만큼 도는 for 문을 작성한다.

그리고 학생의 수와 학생들의 점수를 입력받아야 하므로 StringTokenizer 를 통해 각 값들을 공백을 기준으로 하여 한 줄로 받도록 한다.

학생의 수인 [ number ] 를 입력받고, 배열의 크기를 number 로 설정한다.

결과값이 double 형이기 때문에 일부 변수들은 double 형으로 선언한다.

점수의 합산을 위한 변수 [ sum ]  을 0.0 으로 초기화해주고 학생들의 점수를 입력받을 for 문을 작성한다.

  • 테스트 케이스가 하나씩 끝날 때마다 해당 변수 값이 초기화 되어야 하므로 for 문 안에 들어간다.

0부터 배열의 크기인 number 까지 도는 for 문을 작성하여 그 안에 점수 값을 넣고, 합산 값을 구해준다.

for 문을 빠져나와서 평균값과 평균을 넘은 학생의 수를 세는 변수인 [ avg / cnt ] 를 각각 double 형으로 선언한다.

이전과 동일한 범위의 for 문을 하나 더 선언하고 그 안에서 평균보다 넘는 학생의 수를 구한다.

출력형태가 소수점 셋째 자리까지 나와야 하므로 printf() 와 소수점 형식으로 출력하는 ' % f ' 를 사용하여 결과 형태에 맞게 출력해준다.

  • ' %f ' 는 소수점 형식으로 출력하는 출력 서식이다.
  • %.3f% 는 소수점 아래 3자리 수까지 표시하라는 의미이다.
  • (cnt/number) * 100 을 통해 평균을 넘은 학생들의 비율을 구해준다.

답안 소스

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int C = Integer.parseInt(br.readLine());
		
		int arr[];
		
		StringTokenizer st;
		
		for(int i=0; i<C; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			
			int number = Integer.parseInt(st.nextToken());
			arr = new int[number];
			
			double sum = 0.0;
			
			for(int j=0; j<number; j++) {
				int value = Integer.parseInt(st.nextToken());
				arr[j] = value;
				sum = sum + value;
			}
			
			double avg = (sum / number);
			double cnt = 0.0;
			
			for(int j=0; j<number; j++) {
				if(arr[j] > avg) {
					cnt++;
				}
			}
			System.out.printf("%.3f%%\n",(cnt/number)*100);
		}

	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[백준 알고리즘 자바]4673 : 셀프 넘버  (0) 2021.08.11
[15596]정수 N개의 합  (0) 2021.08.04
[8958]OX퀴즈  (0) 2021.08.01
[1546]평균  (0) 2021.08.01
[3052]나머지  (0) 2021.07.27