이것저것

BOJ - 2108. 통계학 본문

Problem Solving

BOJ - 2108. 통계학

nays111 2021. 1. 12. 17:11
#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