https://www.acmicpc.net/problem/2108
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
산술평균은 소수점 이하 첫째 자리에서 반올림한 값을 출력함
-> 소수점이기 때문에 double형 변수 사용, -0을 피하기 위해 결과값은 int형 변수에 담음
중앙값
-> 0부터 입력을 받았으므로 분자가 n이 아닌 n-1로 해야 함
최빈값
-> 같은 빈도의 최빈값이 여러개 있을 경우에 두번째로 작은 값을 출력하는게 핵심
여기서 애를 많이 먹었다
int mode() {
for (int i = 0; i <= 8000; i++) { // 입력받은 빈도수 중 최빈값 찾기
if (freq[i] > cnt) { //가장 작은 최빈값 구하기
m = i;
cnt = freq[i];
}
}
for (int i = m+1; i <= 8000; i++) { // 두 번째로 작은 최빈값 구하기
if (freq[i] == cnt) { // 같은 빈도수를 가진 최빈값이 있는지, 있다면 해당 값 출력
m = i;
break;
}
}
m = m-4000;
return m;
}
전체적으로 보면 인덱스의 위치를 세심하게 다룰 줄 알고, 변수 선언 및 사용, 구현까지 연습해볼 수 있는 문제이다.
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int n, sum = 0;
int num[500000] = { 0 };
int freq[500000] = { 0 };
int cnt=0,m=0,result=0;
double arithmeticMean() {
double arithMean = (double)sum / n; // (sum/n)을 처음에 double로 맞춰놔야 double변수에 저장된다!!
//소수 n번째 -> 10^(n-1)을 곱하고 나눠주면 됨
result = round(arithMean); // return값을 그대로 round(arithMean)으로 넘겨주면
// (0 + 0 + (-1)) / 3 = -0.333333...에서 0이 결과값으로 나와야 하지만, -0으로 출력됨
// int로 변수에 저장하고 출력하면 0이 나옴
return result;
}
int mode() {
for (int i = 0; i <= 8000; i++) {
if (freq[i] > cnt) { //가장 작은 최빈값 구하기
m = i;
cnt = freq[i];
}
}
for (int i = m+1; i <= 8000; i++) { // 두 번째로 작은 최빈값 구하기
if (freq[i] == cnt) {
m = i;
break;
}
}
m = m-4000;
return m;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> num[i];
sum += num[i];
freq[num[i] + 4000]++; //정수의 절댓값이 4000을 넘지 않으므로
}
sort(num, num + n);
cout << arithmeticMean() << '\n';
cout << num[(n-1) / 2] << '\n'; // 0부터 입력을 받았으니 n/2가 아니라 (n-1)/2 구나..
cout << mode() << '\n';
cout << num[n-1] - num[0] << '\n';
return 0;
}