수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
https://www.acmicpc.net/problem/2108
- max, min 초깃값을 각각 -4000 +4000으로 둔다.
- vector<pair<int, int>>에 입력받은 수,빈도수를 계열화한다.
- 또다른 vector< int>에 그중 최빈값들을 담는다(최빈값이 여러개 일 수 있으므로)
조건에맞게 구현만하면되므로 위 세가지에 유의해서 구현한다.
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using std::sort; using std::vector; using std::pair; using std::floor;
int n, *num, max=-4000, min=4000, mid, range, mode, freq=0;
double avg, sum = 0;
vector<pair<int, int>>list;
vector<int> mode_list; //최빈값 리스트(같은 빈도수인 수가 여럿일수있음)
int main(void) {
scanf("%d", &n);
num = new int[n];
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]);
sum += num[i];
if (min > num[i]) min = num[i];
if (max < num[i]) max = num[i];
}
sort(num, num + n);
avg = sum / (double)n;
mid = num[n / 2];
range = max - min;
int preNum=0x7fffffff, cursor=-1;
for (int i = 0; i < n; i++) { //정렬되있는 모든원소탐색
if (preNum != num[i]) { //이전과 다른 원소일경우
list.push_back({ num[i], 1 });
cursor++;
preNum = num[i];
}
else { //같았으면
int x = list[cursor].first;
int cnt = list[cursor].second;
list.erase(list.begin() + cursor);
list.push_back({ x, cnt + 1 });
}
}
for (int i = 0, m, f; i < list.size(); i++) { //최빈값을 찾음
m = list[i].first; //수
f = list[i].second; //빈도수
if (freq == f) {
mode_list.push_back(m);
}else if (freq < f) {
mode = m;
freq = f;
mode_list.clear();
mode_list.push_back(m);
}
}
if (mode_list.size() == 1) {
mode = mode_list[0];
}
else {
sort(mode_list.begin(), mode_list.end());
mode = mode_list[1];
}
printf("%d\n%d\n%d\n%d", (int)floor(avg + 0.5), mid, mode, range);
return 0;
}