#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
/* <문제해결>
규칙1. 수의 갯수 1 <= N <= 500,000 N은 홀수
규칙2. 입력되는 정수의 절대값은 4,000을 넘지 않음.
이문제는 최빈값을 찾는 방법만 생각해낸다면 나머지는 쉽게 풀 수 있는 문제이다.
주어진 규칙에서 문제를 좀 더 쉽게 해결할 수 있는 힌트가 있다. 바로 절대값이 4,000을 넘지 않는다는것.
입력된 수의 빈도를 저장할 배열을 하나 만들고, 입력된 수를 이 배열의 인덱스로 생각하여
해당 인덱스의 원소값을 +1 해나간다면 빈도를 구할 수 있을것이다.
하지만 -4000부터 -1 까지의 입력을 인덱스로 표현할 수 없으니, -4000부터 -1을 0부터 3999,
0부터 4000 까지의 입력을 4000부터 8000으로 생각하여 문제를 해결하면 쉽게 해결할 수 있다.
*/
int arr[500001]; // .. 입력된 수를 저장할 배열
int modeNum[8001]; // .. 입력된 수의 빈도를 저장할 배열
// 산술평균
int arrMean(int n)
{
double sum = 0; // .. round 함수를 쓰기위한 double형 변수
for (int i = 0;i < n;i++)
{
sum += arr[i];
}
return round((sum / n)); // .. 소수점 첫번째 자리에서 반올림
}
// 중앙값
int arrMedian(int n)
{
int result = arr[n/2]; // .. N이 홀수인 이유
return result;
}
// 최빈값
int arrMode(int n)
{
for (int i = 0;i < n;i++)
{
modeNum[arr[i] + 4000] += 1; // .. -4000~-1을 0~3999 으로생각, 0~4000을 4000~8000 으로생각
}
int theMode = *max_element(modeNum, modeNum + 8001); // .. 빈도수가 최대인 원소찾기
int count = 0;
int result = 0;
for (int i = 0;i < 8001;i++) // .. modeNum을 첫번째 원소부터 순회하며 최빈값인지 비교
{
if (modeNum[i] == theMode)
{
count++; // .. 최빈값이라면 result에 저장, count를 증가시켜 다음 최빈값을 구하기
result = i - 4000;
}
// .. 두번째로 작은 최빈값이면 멈추기
if (count == 2)
{
break;
}
}
return result;
}
// 범위
int arrRange(int n)
{
int result = arr[n - 1] - arr[0];
return result;
}
int main(void)
{
int n;
cin >> n;
for (int i = 0;i < n;i++)
{
cin >> arr[i];
}
sort(arr, arr + n); // .. 오름차순 정렬
cout << arrMean(n) << "\n";
cout << arrMedian(n) << "\n";
cout << arrMode(n) << "\n";
cout << arrRange(n);
return 0;
}
댓글남기기