코딩성장스토리

백준 2108번:통계학 본문

백준 코딩

백준 2108번:통계학

까르르꿍꿍 2021. 9. 25. 17:31

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

 

2108번: 통계학

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

www.acmicpc.net

입력

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

출력

첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

둘째 줄에는 중앙값을 출력한다.

셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.

넷째 줄에는 범위를 출력한다.

 

#include<iostream>
#include<vector>
#include<cmath>
#include<string>
#include <algorithm>
#include<set>
#define PI 3.1415926535
using namespace std;
int cnt[8001] = { 0 };                   //빈도수 알기 위한 배열
int main()
{
	multiset<int> ms;                     //multiset 중복된값 정렬
	vector<int> st;                          //중간값 구하기 위한 배열
	int n, t;
	double sum = 0;
	cin >> t;
	int min = 4000;
	int max = -4000;
	for (int i = 0; i < t; i++) {
		cin >> n;
		ms.insert(n);
		cnt[n+4000]++;
		sum += n;
		if (max < n)
			max = n;
		if (min > n)
			min = n;
	}
	multiset<int>::iterator iter;
	for (iter = ms.begin(); iter != ms.end(); iter++) {             //st배열에 정렬되게 삽입
		st.push_back(*iter);
	}
	int maxin = 0;          //최빈수
	int in = 0;                  //빈수
	for (int i = min + 4000; i <= max + 4000; i++) {            //최빈수값 구하기
		if (cnt[i] > maxin)
			maxin = cnt[i];
	}
	for (int i = min + 4000; i <= max + 4000; i++) {             //최빈수 구하기
		if (maxin == cnt[i]) {
			in = i;
			break;
		}
	}
	for (int i = in+1; i <= max + 4000; i++) {                 //같은 최빈수 두번쨰 작은 수 구하기
		if (maxin == cnt[i]) {
			in = i;
			break;
		}
	}
	cout << round(sum/t)  << '\n' << st[t / 2] << '\n' << in-4000 << '\n' << max - min;
	return 0;
}