알고리즘/C++
[백준/실버3] 백준 2108번 통계학 - c++ (수학/ 구현/ 정렬 알고리즘) 문제 해석/코드 설명
셉인
2024. 3. 12. 19:36
728x90
[백준/실버3] 백준 2108번 통계학 - c++ (수학/ 구현/ 정렬 알고리즘) 문제 해석/코드 설명
코딩테스트 타파하기 1주차 - 2번
문제 해석
- 산술평균 : N개의 수들의 합을 N으로 나눈 값 => 들어오는 값들을 다 더하면 된다.
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값 => 사이즈에서 /2를 해주면 그 인덱스가 중앙값이 된다 (주의 : 무조건 수의 개수가 홀수이기 때문에 case를 수가 짝수인지 홀수인지로 안나눠도 된다.)
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값 => 배열을 생성해서 각 인덱스 별로 몇개가 있는지 알아둔다. 만약 maxidx가 1보다 크면 같은게 여러개니깐 '두 번째'수를 출력해줘야한다.
- 범위 : 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