본문 바로가기

개발/DS&Algorithms

[백준] 평균은 넘겠지_4344_자바

반응형

4344번 Java-평균은 넘겠지


이번 문제의 분류는 <1차원 배열>입니다.

https://www.acmicpc.net/problem/4344

 

4344번: 평균은 넘겠지

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

www.acmicpc.net


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을 사용합니다.

StringTokenizer 생성 및 사용


4. 결론

  • 제출 번호 38392598 : BufferedReader , StringTokenizer
  • 제출 번호 38392556 : Scanner
반응형