본문 바로가기
Algorithm/Baekjoon

[백준] 4344번 : 평균은 넘겠지 - Java

by unknownomad 2022. 3. 5.

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

 

4344번: 평균은 넘겠지

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

www.acmicpc.net



주의점

  1. 소수점 셋째 자리까지 출력
  2. 각 테스트 케이스의 첫 번째 수 : 해당 케이스의 입력 개수
  3. 평균을 넘는 학생 비율 : 퍼센트(%)로 출력

풀이

1. Scanner

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
    
        Scanner in = new Scanner(System.in);		
        int[] arr;
        int C = in.nextInt();
		
        for(int i = 0 ; i < C ; i++) {
            int N = in.nextInt(); //학생수 
            arr = new int[N];
            double sum = 0; //성적 누적 합계 변수
			
            for(int j = 0 ; j < N ; j++) {
                int val = in.nextInt(); //성적 입력
                arr[j] = val;
                sum += val; //성적 누적 합계
            }
            
            double avg = (sum / N) ;
            double cnt = 0; //평균 넘는 학생수 변수
			
            //평균 넘는 학생 비율
            for(int j = 0 ; j < N ; j++) {
                if(arr[j] > avg) {
                    cnt++;
                }
            }
            //소수점 셋째 자리까지 출력
            //"%"도 함께 출력하려면 printf()에서 "%%"로 기재해야 함
            System.out.printf("%.3f%%\n", (cnt / N) * 100);
        }
        in.close();
    }
}

 

2. 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 C = Integer.parseInt(br.readLine());
        StringTokenizer st;
		
        for(int i = 0 ; i < C ; 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 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);
        }
    }
}

성능

  • BufferedReader > Scanner

1차원 배열 마무리

장점

  • 메모리에 연속 연결되어 할당하기에 접근 속도 빠름 = 색인 속도 빠름
  • 참조 위해 추가적인 메모리를 할당할 필요 없음

단점

  • 자료 삭제 / 삽입할 때 다른 데이터들을 밀거나 당겨와야 하기에 배열의 크기가 커질수록 비효율적임
  • 배열의 크기 : 불변 ➡ 메모리가 낭비되거나 데이터는 많으나 배열에 다 넣지 못할 수도 있음

 


출처 : https://st-lab.tistory.com/51

댓글