상세 컨텐츠

본문 제목

[백준/실버3] 백준 2108번 통계학 - c++ (수학/ 구현/ 정렬 알고리즘) 문제 해석/코드 설명

알고리즘/C++

by 셉인 2024. 3. 12. 19:36

본문

728x90

[백준/실버3] 백준 2108번 통계학 - c++ (수학/ 구현/ 정렬 알고리즘) 문제 해석/코드 설명

 

코딩테스트 타파하기 1주차 - 2번

 

문제 해석

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값 => 들어오는 값들을 다 더하면 된다.
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값 => 사이즈에서 /2를 해주면 그 인덱스가 중앙값이 된다 (주의 : 무조건 수의 개수가 홀수이기 때문에 case를 수가 짝수인지 홀수인지로 안나눠도 된다.)
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값 => 배열을 생성해서 각 인덱스 별로 몇개가 있는지 알아둔다. 만약 maxidx가 1보다 크면 같은게 여러개니깐 '두 번째'수를 출력해줘야한다.
  4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이 => 정렬해서 제일 큰 값 - 제일 작은 값

 

알고 있으면 좋은 함수

#include <cmath>

round(num);

 

round 함수  : 반올림하는데 이용할 수 있다.

-> 문제에 적용 : 문제에서 산술평균을 구할 때 소수점 이하 첫째 

 

전체 코드 (코드 해설은 주석으로)

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false); 
    cin.tie(nullptr); cout.tie(nullptr);
    
   vector<int> v;
   int n=0; 
   int num=0;
   cin >> n;
  for(int i=0; i<n; i++){ //벡터(자유크기)에 값 넣어주기
      cin >> num;
      v.push_back(num);
  }
   
    sort(v.begin(), v.end());  //정렬 -> 중앙값, 범위를 구하기 위해서
     
   //산술평균 구하기
   double sum=0;
   for(int i=0; i<v.size(); i++){
       sum+=v[i]; //벡터값을 다 더해준다.
   }
  
   double N = round(sum/v.size()); //반올림 해준다.
   if(N==-0){ //(0 + 0 + (-1)) / 3 = -0.333333... 이고 이를 첫째 자리에서 반올림하면 0이다. -0으로 출력하면 안된다.
       cout << 0<<"\n"; //-0이면 0을 출력하도록 해준다.
   }
   else{
       cout << N<<"\n";
   }
   
      //중앙값
      int vsize = v.size(); 
      cout << v[vsize/2]<<"\n";
   
      //최빈값
      int arr[8001] ={0, };
      for(int i=0; i<vsize; i++){
          arr[v[i]+4000]++; //-4000부터니깐 +4000을 해서 0~8000으로 할 수 있도록 해준다.
      }
   
        vector<int> maxidx;
        int count =0; //최빈값의 수
      for(int i=0; i<=8000; i++){
            if(arr[i]>=count){
                if(arr[i]==count){ //만약 최빈값의 수가 같으면 벡터에 넣어준다.
                    maxidx.push_back(i);
                }
                else{
                maxidx.clear(); //최빈값보다 더 큰 값이 나오면 벡터를 비워주고 다시 새로운 인덱스를 넣어준다.
                maxidx.push_back(i);
                count = arr[i]; //그 뒤 count값을 다시 넣어준다. -> 이 뒤 이 값으로 계속 비교
                }
          }
      }
      
    if(maxidx.size()>1){ // 최빈값이 같은 인덱스가 여러개
    cout << maxidx[1]-4000 <<"\n"; //어차피 오름차순으로 들어감 -> 2번째 수를 출력 근데 앞에서 4000 더했으니깐 4000빼준다.
    }
    else{
         cout << maxidx[0]-4000 <<"\n"; //최빈값이 같은 인덱스가 오직 하나.
    }
    
   //범위
  cout << v[vsize-1]- v[0]; //제일 큰값 - 제일 작은 값
   
    
   return 0;
}

[백준/실버3] 2108번 통계학 - c++ (수학/ 구현/ 정렬 알고리즘) 문제 해석/코드 설명

728x90

관련글 더보기

댓글 영역