#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
// 입력되는 정수의 갯수를 담아놓을 배열
int freqs[8001];
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
// 입력받을 정수들을 쌓아놓는 벡터
vector<int> v;
// 각각 답으로 출력할 변수들
int mean, mid, freq, sco;
int sum = 0; // 평균을 구하기 위한 총합
int max = -4000; // 최댓값을 담아놓을 변수
int min = 4000; // 최솟값을 담아놓을 변수
int n = 0;
cin >> n;
int val;
for(int i = 0 ; i < n ; i++)
{
cin >> val;
sum += val;
if(val > max)
{
max = val;
}
if(val < min)
{
min = val;
}
freqs[val+4000]++;
v.emplace_back(val);
}
// 최빈값이 몇인지 확인
int freqmax = 0;
for(int i = 0 ; i < 8001 ; i++)
{
if(freqs[i] > freqmax)
{
freqmax = freqs[i];
}
}
// 최빈값들이 얼마나 있는지 확인, 2개 이상으로 넘어갈 시 2번째 값을 넣고 종료
int count = 0;
for(int i = 0 ; i < 8001 ; i++)
{
if(freqs[i] == freqmax)
{
count++;
freq = i - 4000;
}
if(count == 2)
{
break;
}
}
sort(v.begin(), v.end());
mean = int(round(sum / (double)n));
mid = v[(n-1)/2]; // n 은 항상 홀수!
sco = max - min; // 사실 v.end() - v.begin() 으로 해도 된다.
cout << mean << '\n';
cout << mid << '\n';
cout << freq << '\n';
cout << sco << '\n';
}
[Try]
1. 산술평균 : 입력받을 때 합을 구해놓고 소숫점을 보고 직접 판별 -> 그냥 cmath 의 round 함수 사용
중앙값 : 정렬 후 가운데 인덱스로 구한다
최빈값 : -4000~4000 까지 갯수를 저장하는 배열을 만들어놓고 반복돌려준다
범위 : 입력받을 때 최대 최소 값을 구해놓는다.
[Point]
1. 최빈값 구하는게 넷중에 가장 복잡한 것 같다. 평균과 범위는 너무 단순한 방식이고, 중앙값 역시 sort()만 사용하면 해결되는 문제
이다. 최빈값을 갯수저장해놓는 배열을 따로 만들어놓는 방식은 입력되는 최대 정수값이 4000 이었으니 가능한 일이지, 몇십만
정도만 되었어도 사용하지 못했을 것 같다.
2. 최대 최소 값 역시 정렬한 후 벡터의 첫원소와 마지막원소를 사용하면 되는데 불필요하게 입력받을때마다 업데이트해줬다.
3. 최빈값은 다들 비슷한게 푸신 것 같아 마음이 놓인다..
[More]
'PS > BOJ' 카테고리의 다른 글
[백준] 2448.py : 별 찍기 - 11 (0) | 2020.05.16 |
---|---|
[백준] 10989.cpp : 수 정렬하기 3 (0) | 2020.05.15 |
[백준] 11651.cpp : 좌표 정렬하기 2 (0) | 2020.05.14 |
[백준] 7568.cpp : 덩치 (0) | 2020.05.14 |
[백준] 1436.cpp : 영화감독 숌 (0) | 2020.05.13 |