반응형
4344번 Java-평균은 넘겠지
이번 문제의 분류는 <1차원 배열>입니다.
https://www.acmicpc.net/problem/4344
1. 문제
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다.
당신은 그들에게 슬픈 진실을 알려줘야 한다.
* 문제가 조금 웃기다ㅋㅋ😥
2. 예제
3. 풀이
이번에는 두 가지 방식으로 풀려고 합니다. 첫 번째 풀이는 Scanner를 활용하고, 두 번째는 BufferedReader를 활용할 것입니다. BufferedReader를 활용할 때 StringTokenizer를 활용하게 될 것입니다. 자세한 개념은 풀이를 하며 설명드리겠습니다.
- 방법 1
Scanner 패키지를 활용한 풀이 방법
import java.util.Scanner;
//Scanner 풀이 방법
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int testCase = sc.nextInt(); // test 횟수 입력
for(int i=0;i<testCase;i++) {
int n = sc.nextInt(); // 학생 수
int[] arr = new int[n]; // 한 테스트 안에 학생 수 만큼에 성적 배열
int sum=0; // 성적 누적 합
// 성적 입력
for(int j=0;j<n;j++) {
int val=sc.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);
}
}
}
1) 위와 같이 코드를 작성하면 아래와 같은 결과가 출력됩니다.
저는 이제까지 백준의 예제 출력처럼 결과가 한 번에 출력되어야 하는 줄 알았습니다. 하지만 위 같은 방법도 정답으로 인정해주었습니다.
만약 한번에 모든 값을 입력하고, 모든 결과를 한번에 출력하길 원한다면 아래 코드와 이미지를 참고해주세요.
모든 결과를 담는 배열 생성 후 마지막에 출력
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int textCase = sc.nextInt();
int[] arr; //한 테스트 내의 점수 배열
int n = 0; // 학생 수
int val = 0; //점수
double[] average = new double[textCase];
for(int i=0;i<textCase;i++) {
n=sc.nextInt();
arr = new int[n];
int sum = 0; // 점수 누적 합
double mean = 0; //평균
double count = 0; // 평균을 넘는 학생 수
for(int j=0;j<n;j++){
val = sc.nextInt();
arr[j] = val;
sum += val;
}
mean = sum/n;
for(int j=0;j<n;j++) {
if (mean < arr[j]) {
count++;
}
}
average[i] = ((count/n) *100);
}
for(int i=0;i<average.length;i++) {
System.out.printf("%.3f%%\n",average[i]);
}
}
}
저는 예제 출력과 같이 모든 값을 한번에 입력하고, 출력해야만 하는줄 알았습니다.
하지만 위와 같이 풀었을 때 오답 확률이 높아졌습니다.
3) 자바의 Printf( )
지시를 통해 변수의 값을 여러 가지 형식으로 바꿔서 출력할 때 사용합니다.
System.out.printf("출력 서식", 출력 할 내용);
%d | 정수형 출력 |
%s | 문자형 출력 |
%f | 실수형 출력 |
%c | 문자열 출력 |
%n | 줄 바꿈 |
%b | boolean 출력 |
%.3f : 실수형을 소수점 셋째 자리까지 출력
%% : 특수 문자 % 출력
- 방법 2
BufferedReader와 StringTokenizer 활용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
//BufferedReader 와 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);
}
}
}
1) BufferedReader는 입력한 수들을 한 줄로 통째로 읽습니다. 따라서 Scanner에 비해 빠른 속도로 결과를 출력하는데요. 단, 한 줄로 입력했을 때 공백을 기준으로 값들을 분리해줘야 합니다. 그 방법으로 StringTokenizer을 사용합니다.
4. 결론
- 제출 번호 38392598 : BufferedReader , StringTokenizer
- 제출 번호 38392556 : Scanner
반응형
'개발 > DS&Algorithms' 카테고리의 다른 글
[알고리즘] 정렬 알고리즘 정리(2) (4) | 2022.02.04 |
---|---|
[백준] 최소,최대_10818_자바 (6) | 2022.02.01 |
[백준] 서로 다른 나머지 개수 구하기_3052_자바 (4) | 2022.01.30 |
[알고리즘] 정렬 알고리즘 정리 (4) | 2022.01.10 |
[알고리즘] 이진 탐색(Binary search)을 통해 수 찾기 (0) | 2022.01.06 |