[백준] #4344 평균은 넘겠지_자바
#4344 평균은 넘겠지_자바
문제
대학생 새내기들의 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
풀이
풀이에 앞서 문제를 어떤 방식으로 풀어야 할지 생각해보자. 이 문제는 백준 단계별 풀어보기 배열 파트에 속해 있는 문제이긴 하지만 무작정 배열을 이용해 풀기 보단 왜 배열을 쓸 수 밖에 없는지를 알아야 한다.
입력으로 주어지는 단서는 1) 테스트 케이스의 개수 C 2) 각 테스트 케이스마다 주어지는 학생의 수 N 3) N명의 점수 세 가지이다.
개수가 주어지는 조건을 보자마자 떠오르는 방법은 반복문이다. 여러 번 반복해야 하는구나 => for문 사용으로 이어진다. 너무 당연한 얘기므로 다음부턴 생략하겠지만 당연하게 사용되는 것이 왜 당연하게 사용되는 지 아는 것은 중요하다.
두 번째 조건으로 다시 개수가 주어진다. 위와 같은 논리로 for문을 사용해야 할 것이다. 다만 이전 for문과 종속적인 관계에 놓여있으므로 for문 속 for문을 사용해야 한다.
이제 점수를 저장해야 할 공간이 필요하다. 여기서 변수를 점수마다 설정한다고 가정해보자. 가정하는 순간 뭔가 잘못되었음을 직감한다. 각각의 변수를 따로 저장하려면 너무 많은 작업이 필요할 뿐더러 for문 사용한 이유가 사라져버린다.
따라서 우리는 자연스럽게 배열을 사용할 생각을 하게 된다. 사실 반복문과 배열은 뗄 수 없는 관계다. 반복문이 사용되면 자연스레 배열이 따라온다.
4344번 문제는 입력 값을 Scanner로 받을 수도 있고 BufferedReader로 받을 수 있어 문제를 푸는 방법도 두 가지이다.
Scanner로 풀기
import java.util.Scanner;
public class AreYouGenius {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr;
int testcase = scanner.nextInt();
for(int i = 0; i < testcase ; i++) {
int N = scanner.nextInt();
arr = new int[N];
double sum = 0;
for(int j = 0; j < N; j++) {
int val = scanner.nextInt();
arr[j] = val;
sum += val;
}
double mean = (sum / N);
double count = 0;
for(int j = 0; j < N; j++) {
if(arr[j] > mean) {
count++;
}
}
System.out.printf("%.3f%%\n",(count/N)*100);
}
scanner.close();
}
}
주의할 점은 출력 값을 소수 셋째 자리까지 출력해야 하고 %를 나타내야 한다는 건데 printf 를 써서 %.3f로 포멧을 지정하면 셋째 자리까지 나타낼 수 있고 %를 %앞에 붙여주면 %를 출력할 수 있다.
BufferedReader로 풀기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] arr;
int testcase = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i = 0 ; i < testcase ; i++) {
st = new StringTokenizer(br.readLine()," ");
int N = Integer.parseInt(st.nextToken());
arr = new int[N];
double sum = 0;
for(int j = 0 ; j < N ; j++) {
int val = Integer.parseInt(st.nextToken());
arr[j] = val;
sum += val;
}
double mean = (sum / N) ;
double count = 0;
for(int j = 0 ; j < N ; j++) {
if(arr[j] > mean) {
count++;
}
}
System.out.printf("%.3f%%\n",(count/N)*100);
}
}
}
BufferedReader을 쓰는 방법도 Scanner와 비슷하다. 하지만 BufferedReader는 한 줄을 통째로 읽으므로 이중 for문의 첫번째 for문에서는 입력 대신 StringTokeniz-er에 공백을 기준으로 구분된 토큰을 반환해 배열에 저장한다.
(위 내용과 코드는 K.D.Gyun의 github을 참고해 만들었습니다.)
Author And Source
이 문제에 관하여([백준] #4344 평균은 넘겠지_자바), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@oycoyj/백준-4344-평균은-넘겠지자바저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)