본문 바로가기
개발자 전향 프로젝트

[백준] [알고리즘 4344번: 평균은 넘겠지] JAVA

by 샘오리 2022. 7. 11.

평균은 넘겠지 

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 256 MB 206261 74278 61518 35.967%

문제

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

입력

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

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

출력

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

예제 입력 1 복사

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

예제 출력 1 복사

40.000%
57.143%
33.333%
66.667%
55.556%

풀이

============================================================================================

이 문제는 난이도가 어느정도 있는 편으로 확 와닿지는 않을 수 있는데 풀이를 보면 어느정도 이해가 갈 것이다.

 

일단 문제가 원하는 것을 제대로 파악해야 한다. 평균값을 구하는 것이 아니라, 평균을 넘는 학생의 수가 총 학생의 수에서 어느정도 비율인지 구해서 그 비율을 적으라는 뜻이다.

 

예를 들어 5명의 학생이 있고 각각 시험에서 20 40 60 80 100 점을 맞았다고 치자.

그렇다면 평균은 60점이 될테고

60점을 넘는, 즉 초과하는 점수를 받은 학생은 80점과 100점을 맞은 2명의 학생 뿐이다.

고로 2 / 5 = 40퍼센트이며 이를 반올림하여 소수점 셋째 자리까지 출력하라는 뜻이다. 

 

그렇다면 바로 코드로 들어가보자. 

 

어김없이 입력 값을 받아주기 위해 BufferedReader를 소환하고 총 테스트 케이스를 C라는 변수에 담아주었다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int C = Integer.parseInt(br.readLine()); // 총 테스트 케이스 수

입력한 값들이 하나같이 공백으로 띄어져 있으니 StringTokenizer를 선언해줘야 한다.

입력받은 값들을 배열안에 넣어서 임시로 저장해둬야 하니 배열도 선언만 해준다.

선언만 하는 이유는 반복문 안에서 사용될 것이기에 그렇다. 반복문안에서 참조변수로 받아서 인스턴스화 할것이다.

int[] arr;
StringTokenizer st;

이제 본격적인 반복문이다.

외부 for문 같은 경우 아래와 같다. C만큼 돌 것이며 Tokenizer를 인스턴스화 해서 BufferedReader를 받고 첫 토큰인 학생의 수를 N이라는 변수에 저장한 다음

N 크기 만큼의 빈 배열을 만드는 것이다.

for(int i = 0 ; i < C ; i++) {
  st = new StringTokenizer(br.readLine());
  int N = Integer.parseInt(st.nextToken());  // 맨 왼쪽 학생 수
  arr = new int[N]; //학생 수 만큼 배열 생성

그 다음은 학생들의 성적을 배열에 저장하는 것이다. 성적의 합을 담을 sum이라는 변수를 선언해주고

반복문을 통해 배열에 순서대로 넣어주며 누적합을 통해 sum이라는 변수에 담아준다.

double sum = 0; // 평균을 구하기 위한 성적의 합
// 성적 입력부분
for(int j = 0 ; j < N ; j++) {
  arr[j] = Integer.parseInt(st.nextToken()); // 성적 저장
  sum += arr[j]; // 성적 누적 합
}

이제 하나의 배열에 학생들의 점수가 순서대로 들어갔으니 평균을 구해야 한다.

평균을 담을 mean이라는 변수와 평균 넘는 학생의 수를 담을 count라는 변수를 선언한다.

그리고 반복문을 통해 평균값을 초과하는 점수를 발견하면 1을 더해줌으로써 세어준다. 

그러면 count라는 변수에는 평균을 넘은 학생의 수가 저장되는 것이다.

double mean = sum / N ; // 평균 값
double count = 0; // 평균 넘는 학생 수 변수

// 평균 넘는 학생 수 구하기
for(int k = 0 ; k < N ; k++) {
  if(arr[k] > mean) {
    count++;
  }
}

 이제 평균 넘는 학생 수를 총 학생 수로 나눠서 평균 넘는 학생 수의 비율 구하면 된다.

우리는 연산을 하고 출력하지 않고 출력문에서 바로 연산을 해보자.

 

소수점 3번째 자리 반올림해야 하기에 %.반올림할숫자f 의 공식을 따라주고

% 기호는 두번 써줘서 컴퓨터로 하여금 이게 연산을 위한 것이 아니라

우리에게 보여지는 기호라는 것으로 인식하게 해준다.

System.out.printf("%.3f%%\n",(count/N)*100);

%% 써줘야 인식한다 휴먼

그럼 끝.