수행일자 : 2021.08.01
https://www.acmicpc.net/problem/4344
문제
- 대학생 새내기들의 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 |