반응형
구현 문제였습니다. -가 포함되어 있어 꼼꼼한 처리가 필요합니다.
풀이방법
구해야 할 값이 총 4가지입니다. 각각은 함수로 구현했습니다.
1. 산술평균 : (모든 값의 합 / n) 을 소수 첫째자리에서 반올림한 후 반환합니다.
2. 중앙값 : 저의 경우 값을 입력받는 배열의 인덱스가 1부터 시작하므로 배열의 n/2+1번째 값을 반환해줍니다.
3. 가장 빈도 수가 많은 값 또는 두 번째로 작은 값(빈도수가 같을 경우) :
3-1.<int,int>형의 map변수를 선언해 첫 번째에는 입력받은 배열의 값, 두 번째에는 그 값이 나온 빈도 수를 저장합니다.
3-2. 가장 큰 빈도 수를 구한 뒤 저장합니다.
3-3. <int>형의 vector 변수를 선언해 가장 큰 빈도 수와 같은 빈도를 가진 배열의 값들을 저장합니다. 그 후 오름차순으로 정렬해 줍니다.
3-4. 해당 vector변수의 size가 1이면 겹치는 빈도 수의 값이 없으므로 첫번째 값을 반환합니다. 아닌 경우엔 두 번쨰 값을 반환해줍니다.
4. 범위 : 가장 큰 값, 작은 값을 구한뒤 차이를 반환해줍니다.
Code
#include <bits/stdc++.h>
using namespace std;
int num[500001];
int n;
double getAvg(){
double sum = 0;
for(int i = 1; i <= n; i++) sum += num[i];
return round(sum / (double)n);
}
int getMiddleValue(){
sort(num+1, num+n+1);
return num[n/2+1];
}
int getSecondFrequencyValue(){
map <int,int> m;
for(int i = 1; i <= n; i ++){
if(m[num[i]]) m[num[i]]++;
else m[num[i]] = 1;
}
int maxFrequency = 0;
vector <int> f;
for(auto p:m){
if(maxFrequency < p.second){
maxFrequency = p.second; //가장 자주 나오는 빈도수
}
}
for(auto p : m){
if(maxFrequency==p.second){
f.push_back(p.first);
}
}
sort(f.begin(),f.end());
if(f.size()==1) return f[0];
return f[1];
}
int getMinMaxGap(){
int minVal = 0x7f7f7f7f;
int minIdx = 0;
int maxVal = -0x7f7f7f7f;
int maxIdx = 0;
for(int i = 1; i<=n; i++){
if(maxVal < num[i]){
maxVal = num[i];
maxIdx = i;
}
if(minVal > num[i]){
minVal = num[i];
minIdx = i;
}
}
return maxVal - minVal;
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> num[i];
cout << getAvg() <<'\n';
cout << getMiddleValue() <<'\n';
cout << getSecondFrequencyValue() <<'\n';
cout << getMinMaxGap() <<'\n';
}
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 1259번 : 팰린드롬수 (0) | 2020.07.08 |
---|---|
(C++) - 백준(BOJ) 8979번 : 올림픽 (0) | 2020.04.17 |
(C++) - 백준(BOJ) 18808번 : 스티커 붙이기 (0) | 2020.04.05 |
(C++) - 백준(BOJ) 17174번 : 전체 계산 횟수 (0) | 2020.03.12 |
(C++) - 백준(BOJ) 18301번 : Rats 답 (1) | 2020.02.06 |