득이공간

[백준 C++] 2108 통계학 - 정렬 본문

PS/알고리즘 문제풀이

[백준 C++] 2108 통계학 - 정렬

쟁득 2024. 1. 28. 20:04

 

 

2108번: 통계학

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

www.acmicpc.net

#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> Sequence;

bool compare(pair<int, int> a, pair<int, int> b)
{
	return (a.second == b.second) ? a.first < b.first : a.second > b.second;
}

int main()
{
	int N;
	cin >> N;

	Sequence.reserve(N);
	for (int i = 0; i < N; ++i)
	{
		int Number;
		cin >> Number;
		Sequence.emplace_back(Number);
	}

	sort(Sequence.begin(), Sequence.end());

	vector<pair<int, int>> FrequencyMap;

	int Sum = 0;
	for (const int& Number : Sequence)
	{
		Sum += Number;

		auto iter = find_if(FrequencyMap.begin(), FrequencyMap.end(),
			[&](pair<int, int> value)
			{
				return value.first == Number;
			}
			);

		if (iter == FrequencyMap.end())
		{
			FrequencyMap.emplace_back(Number, 1);
		}
		else
		{
			++(*iter).second;
		}
	}

	sort(FrequencyMap.begin(), FrequencyMap.end(), compare);
	while (FrequencyMap.back().second != FrequencyMap.front().second)
	{
		FrequencyMap.pop_back();
	}

	int Average = round((float)Sum / Sequence.size());
	int Median = Sequence[Sequence.size() / 2];
	int Mode = (FrequencyMap.size() > 1) ? FrequencyMap[1].first : FrequencyMap[0].first;
	int Range = Sequence.back() - Sequence.front();

	cout << Average << '\n';
	cout << Median << '\n';
	cout << Mode << '\n';
	cout << Range << '\n';
}

 

최빈값을 구할 때

pair 값을 이용해서 각 숫자의 빈도를 체크할 수 있게 벡터에 넣어주었습니다.

 

그리고 조건자를 이용해서 빈도수에 따라 내림차순 정렬 후 (빈도수가 같을 경우 숫자에 따른 오름차순)

빈도수가 제일 많은 값과 다른 원소들은 벡터에서 모두 삭제했습니다.

 

그리고 남은 원소가 여러 개일 경우 두 번째 원소를 선택하도록 구현했습니다.