알고리즘/백준
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