이것저것
BOJ - 2108. 통계학 본문
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <stack>
#include <queue>
#include <map>
#include <functional>
using namespace std;
double sansulAvg(vector<int> v){
double sum = 0;
for(int i=0;i<v.size();i++){
sum+=v[i];
}
if(to_string(round(sum/(double)v.size()))=="-0"){ //?
return 0;
}else{
return round(sum/(double)v.size());
}
}
int middleVal(vector<int> v){
sort(v.begin(),v.end());
int mid = v.size()/2;
return v[mid];
}
//사용자 정의 정렬 함수
//정렬할때 sort(begin(),end(),compareSort)
//begin()와 end() 는 &로 받아줘야함
bool compareSort(const pair<int, int> &v1, const pair<int,int> &v2){
if(v1.second==v2.second){// 빈도수가 만약에 같다면
return v1.first<v2.first;
}
return v1.second>v2.second; //아니면 내림 차순
}
int mostVal(vector<int> v){
vector<pair<int,int>> v2;
sort(v.begin(),v.end());
for(int i=0;i<v.size();i++){
if(v2.empty()){
v2.push_back(make_pair(v[i],1)); //맨처음꺼만 넣기
continue;
}
if(v2.back().first == v[i]){ //단순 숫자를 증가시킬 수 없기 때문에 temp에빼놨다가 넣기
pair<int,int> temp = v2.back();
temp.second++;//temp 에 빼논걸 증가
v2.pop_back();
v2.push_back(temp); //다시 큐에 삽입
}else{
v2.push_back(make_pair(v[i],1)); //중복되는 경우가 없을 경우 그냥 한번쓰였다고 삽입
}
}
//빈도수는(second) 높은순서대로(1순위) v[i]는 작은 순서대로 정렬(2순위)
//사용자정의 정렬 함수를 만들어야할듯
sort(v2.begin(),v2.end(),compareSort);
//어차피 두번째로 큰수는 [1].second에 있음
if(v2[0].second == v2[1].second){
//만약 빈도수가 같으면
return v2[1].first;
}else{
return v2[0].first;
}
}
int rangeVal(vector<int> v){
sort(v.begin(),v.end());
return v[v.size()-1]-v[0];
}
int main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int N;
cin>>N;
vector<int> v;
for(int i=0;i<N;i++){
int a;
cin>>a;
v.push_back(a);
arr[a+4000]++;//음수값이 나올수도 있으니깐
}
cout<<sansulAvg(v)<<endl;
//printf("%1.lf\n",sansulAvg(v));
cout<<middleVal(v)<<endl;
cout<<mostVal(v)<<endl;
cout<<rangeVal(v)<<endl;
return 0;
}
- 최빈값을 구하는데 애를 좀 먹었다. (위에선 mostval)
방법 1) 각 숫자가 몇 번 나오는지를 구해야하는데 음수인 경우 단순 배열로 만들 수 없다고 생각하여 숫자와 몇번나오는지를 함께 묶어 queue<pair<int,int>> 로 만들어보았다.
(인터넷을 찾아보니깐 배열의 크기를 8002까지 잡아 양수인부분은 4001부터 시작하게끔 만드는 경우도 있더라)
- 빈도수는(second) 높은순서대로(1순위) v[i]는 작은 순서대로 정렬(2순위)
사용자정의 정렬 함수를 만들서 해결했다.
//사용자 정의 정렬 함수
//정렬할때 sort(begin(),end(),compareSort)
//begin()와 end() 는 &로 받아줘야함
bool compareSort(const pair<int, int> &v1, const pair<int,int> &v2){
if(v1.second==v2.second){// 빈도수가 만약에 같다면
return v1.first<v2.first;
}
return v1.second>v2.second; //아니면 내림 차순
}
compare 함수를 반들때는 인자값들을 참조형으로 받아줘야한다고 기억하자.
- 다 처리했는데도 불구하고 계속 에러에 걸렸다.
산술평균을 구할때 -0 이 나왔기때문이다
그래서 경우를 나누어 -0 이 나올경우 0 으로 바꿔 출력되게끔 수정하였다.
'Problem Solving' 카테고리의 다른 글
BOJ - 10779. 쇠막대기 (0) | 2021.01.14 |
---|---|
BOJ - 2304. 창고 다각형 (0) | 2021.01.14 |
BOJ - 2812. 크게 만들기 (0) | 2021.01.12 |
BOJ - 2075. N번째 큰 수 (0) | 2021.01.12 |
BOJ - 1966. 프린터 큐 (0) | 2021.01.12 |
Comments