[C++] 백준 2108 : 통계학

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;

int N, x, sum = 0;
int visit[8001] = {0};
int main(int argc, char **argv){
    scanf("%d",&N);
    vector<int> v;

    for(int i=0; i<N; i++){
        scanf("%d",&x);
        v.push_back(x);
        visit[v[i] + 4000]++; //개수 세기
        sum += x;
    }

    sort(v.begin(),v.end()); //정렬

    printf("%d\n", (int)round((double)sum/N)); // 산술평균 - round 반올림
    printf("%d\n", v[N/2]); //중앙값

    int idx, max = 0;
    for (int i = 0; i < 8001; i++) // -4000 ~ 4000
	{
		if (visit[i] > max){ // 최빈값 찾기
			max = visit[i]; // 비교값
			idx = i; // 최빈값 저장
		}
	}
	
	for (int i = idx + 1; i < 8001; i++) { // 최빈값 다음부터 search
		if ((visit[i] == max)){ // 최빈값 또 있을 경우
			idx = i; // 최빈값 저장
			break;
		}
	}

    printf("%d\n", idx - 4000);
    printf("%d\n", v[v.size() -1] - v[0]); // 범위

    return 0;
}

최빈값에서 STL의 upper_bound와 lower_bound를 사용해보려 애쓰다가 다른 방식으로 틀어 풀게 된 문제.
최빈값을 찾을 때는 index에 해당 개수를 세는 것이 제일 효율적인 것 같다. 크기가 너무 많지 않은 경우에는!

좋은 웹페이지 즐겨찾기