알고리즘/백준

2108 통계학

익명의 문과 개발자 2023. 5. 18. 22:14
728x90
728x90
import java.io.*;
import java.util.*;

public class Main {
	public static void main (String [] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
		//수의 개수 입력
        int N = Integer.parseInt(br.readLine());			
        //산술평균을 계산할 수, 소수 첫째 자리에서 반올림해야하기 때문에 실수로 받는다!
		double sum = 0;
        //중앙값
		int center = 0;
        //최빈값
		int temp = 0;
        //최대 / 최소 
		int max = Integer.MIN_VALUE;
		int min = Integer.MAX_VALUE;
		
        //절대값이 4000이 넘지 않기 때문에 총 배열의 길이를 8000까지 가능하게 8001으로 설정
        // ex ) 수가 -4000 이면 인덱스 0번.  수가 4000이면 인덱스 8000번.
		int [] arr = new int [8001];
		
        //중앙값을 구하기 위해 우선순위 큐를 사용한다!
		PriorityQueue<Integer> q = new PriorityQueue<>();
		for(int i = 0; i<N; i++) {
        	//N개의 정수 중 i+1번째 정수
			int num = Integer.parseInt(br.readLine());
            
            //산술평균 값을 구하기 위해 sum에 정수들을 더해준다.
			sum += num;
            
            //중앙값을 구하기 위해 큐에 모두 넣어준다.
			q.offer(num);
			
            //인덱스값이 입력받은수 + 4000인 곳의 값을 +1 해준다.
			arr[num+4000]++;
			
            //최대와 최소 비교해주며 구하기.
			max = Math.max(max,  num);
			min = Math.min(min,  num);
		}
		
		//산술평균
        //정수를 모두 더해준 sum 값을 정수의 개수 ( N )으로 나눠준 다음 
        //Math.round() 를 통해 소수 첫째자리에서 반올림해준다.
		sum = Math.round(sum/N);
        //출력할때는 int로 묵시적 형변환하여 출력 !
		System.out.println((int)sum);
		
		//중앙값
        //q.size() 큐의 크기 == N ( 정수의 개수 )
        //정수의 개수는 홀수이기 때문에 ( 문제에 설명되어 있음 )
        //2로 나누어주면 그 다음 큐에서 나오는 정수가 중앙값이다 !
		int n = q.size()/2;
		for(int i = 0; i<n; i++) {
			q.poll();
		}
		center = q.poll();
		System.out.println(center);
		
		//최빈값
        //최빈값을 비교해줄 수 tmp를 선언해준다.
		int tmp = -1;
        //최빈값이 여러 개일 경우에는 두 번째로 작은 값을 출력하기 때문에
        //몇번째 인지 알아볼 수 count 를 선언해주고
		int count = 0;
		for(int i = 0; i < 8001; i++) {		//0 ~ 8000까지 돌면서 ( -4000 ~ 4000까지 )
			if(arr[i] > tmp) {	//arr[i]가 tmp보다 크다면
				tmp = arr[i];	//tmp를 arr[i]로 초기화해주고
				temp = i-4000;	//최빈값도 i - 4000 으로 초기화해준다.
				count = 1;	//i가 지금까지 최빈값 중 몇번째로 나온 수인지 확인하기위해
                				//1로 초기화해준다
			
            //지금 찾아둔 최빈값과 이번(i번)째의 값이 같고
            //이미 앞에 같은 빈도수가 나온적 있다면
			}else if (arr[i] == tmp && count == 1) { 	
				temp = i-4000;	//최빈값을 i - 4000으로 초기화한다. 
				count = 0;	//2번째일 때만 최빈값을 새로초기화해야하기 때문에
                				//count 를 다시 0으로 바꿔준다 !
			}
		}
		System.out.println(temp);
		
		//범위 구하기 : 최댓값 - 최솟값
		int result = max - min;
		System.out.println(result);
	}
}

 

틀린 부분 또는 개선할 부분 있다면 댓글 주세요~

 

 

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

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

728x90