[★2][백준4344번]평균은 넘겠지 (JAVA)
카테고리: BKJN
태그: Algorithm Java Coding Test
[★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 9140.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
문 안에 따로 다시 작성해줘야된다는 정도면 알고 있으면 될 것 같다.
댓글 남기기