https://www.acmicpc.net/problem/2108
최빈값 조건이 까다로웠다.. 여러 개 있을 때 두 번째로 작은 값을 출력해라...
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
int first(vector<int>& v)
{
double sum = 0;
int size = v.size();
for (int i = 0; i < size; i++)
{
sum += v[i];
}
return round(sum / size);
}
int second(vector<int> v)
{
sort(v.begin(), v.end());
int index = (v.size() / 2);
return v[index];
}
int third(vector<int> v)
{
vector<int> result;
int a;
int count = 0;
sort(v.begin(), v.end());
int arr[8001] = { 0, };
int size = v.size();
for (int k = 0; k < size; k++)
{
arr[v[k] + 4000]++;
}
int maximum = *max_element(arr, arr + 8001);
for (int k = 0; k < 8001; k++)
{
if (arr[k] == maximum)
{
count++;
a = k - 4000;
}
if (count == 2)
break;
}
return a;
}
int fourth(vector<int>& v)
{
int maximum = *max_element(v.begin(), v.end());
int minimum = *min_element(v.begin(), v.end());
return (maximum - minimum);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N;
cin >> N;
vector<int> v;
for (int i = 0; i < N; i++)
{
int temp;
cin >> temp;
v.push_back(temp);
}
cout << first(v) << '\n';
cout << second(v) << '\n';
cout << third(v) << '\n';
cout << fourth(v) << '\n';
return 0;
}
산술평균의 경우는 round함수를 이용해서 반올림해주었다.
최빈값의 경우.. 문제 조건에서 정수의 범위가 4000을 넘지 않는다 했으므로 범위는 -4000~4000 이므로
arr[8001]을 해주고 정수당 몇개가 들어가는지 파악했다.
그러고 나서 max_element로 arr의 최대값, 즉 가장 최빈값의 인덱스를 찾아서
두 번째인 경우를 return 해주었다.
sort 하는 경우에 사용하는 함수는 reference(&)로 받으면 다른 함수에서 sort 된 vector을 사용해서
그냥 value로 받았다. 그러다보니 메모리를 좀 많이 사용한 것 같다..
'백준 문제풀이 > 실버3' 카테고리의 다른 글
백준 1213번 - 팰린드롬 만들기 (0) | 2022.07.05 |
---|---|
백준 14425번 - 문자열 집합 (0) | 2022.06.08 |
백준 1929번 - 소수 구하기 (0) | 2022.03.02 |
백준 3085번 - 사탕 게임 (0) | 2022.01.16 |
백준 1269번 - 대칭 차집합 (0) | 2021.10.22 |