득이공간

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

PS/알고리즘 문제풀이

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

쟁득 2024. 1. 28. 20:04

 

 

2108번: 통계학

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

www.acmicpc.net

cpp
#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 값을 이용해서 각 숫자의 빈도를 체크할 수 있게 벡터에 넣어주었습니다.

 

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

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

 

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