문제

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

 

 

2108번: 통계학

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

www.acmicpc.net

풀이

문제를 보면 입력값이 -4000부터 +4000까지 입력될 수 있다. 

 

이를 위해 입력부터 +4000을 해주고 max값 8000까지 배열을 할당하도록 하자.

 

최빈값 조건만 유의한다면 다음과 같이 풀 수 있다.

 

코드

#include<iostream>
#include<unordered_map>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int N;
vector<int> arr;
vector<int> result;
int map[8002]; //-4000~8000
int main() {
	//N홀수 
	cin >> N;

	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		arr.push_back(a);


	}
	// 산술평균
	int temp = 0;
	for (int j = 0; j < arr.size(); j++) {
		temp += arr[j];
	}
	result.push_back(round((double)temp / arr.size()));

	//중앙값
	sort(arr.begin(), arr.end());
	result.push_back(arr[arr.size() / 2]);

	//최빈값, 여러개 존재하면 두번째로 작은값`
	for (int i = 0; i < arr.size(); i++) {

		map[arr[i]+4000]++;

	}
	int max = 0;
	int check = 0;

	for (int i = 0; i < 8001; i++) {
		if (max < map[i]) {
			max = map[i];
			check = i;

		}
		
	}

	for (int j = check + 1; j < 8001; j++) { // 최빈값 여러개일경우
		if (map[j] == max) {
			check = j;
			break;
		}

	}

	result.push_back(check-4000);

	//범위
	result.push_back(arr[arr.size() - 1] - arr[0]);


	
	for (int k = 0; k < result.size(); k++) {
		cout << result[k] << '\n';
	}
	return 0;
}

 

 

+ Recent posts