#작성 코드

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int N;
int arr[500000];

bool comp(pair<int, int> a, pair<int, int> b){
	if( a.second == b.second ){
		return a.first < b.first;
	}
	else
		return a.second>b.second;
}

int findmaxcount(int *arr, int N){
	vector< pair<int, int> > count;		// 값, 빈도 저장할 배열 0으로 초기화 
	for(int i=0; i<N; i++){
		if(count.empty()){
			count.push_back(pair<int, int>(arr[i], 1));
			continue;	
		}
		if(count.back().first == arr[i]){		// arr이 순서대로 정렬되어있으므로 가능하다. 
			pair<int, int> tmp = count.back();
			tmp.second++;
			count.pop_back();
			count.push_back(tmp);
		}
		else{
			count.push_back(pair<int, int>(arr[i], 1));
		}
	}
	// '1순위 : 빈도, 2순위 : 값 작은 순서'로 정렬
	sort(count.begin(), count.end(), comp );
	
	if( count[0].second == count[1].second){
		return count[1].first;	// 빈도수 같으면 값 더 큰것 
	}
	else{
		return count[0].first;	// 빈도수 더 큰것. 
	}
}
int main(){
	scanf("%d", &N);
	double sum=0;
	for(int i=0; i<N; i++){
		scanf("%d", &arr[i]);
		sum+=arr[i];
	}
	sort(arr, arr+N);		// arr 배열을 오름차순으로 정렬 
	
	int maxcount = findmaxcount(arr, N);
	printf("%d\n", (int)floor(sum/N+0.5));	// 산술평균 출력(소수점이하 첫째자리에서 반올림) 
	printf("%d\n", arr[N/2]);			// 중앙값 출력
	printf("%d\n", maxcount);			// 최빈값 출력
	printf("%d\n", arr[N-1]-arr[0]);	// 범위 출력 
	return 0; 
} 

##

최빈값을 구할 때, 2차원 count배열을 만들어서 [값][0]에 값을 저장하고, [값][1]에 빈도수를 저장하려고 했지만 음수 값 케이스를 생각하지 못했다. 음수는 배열의 인덱스로 사용할 수 없기 때문에  => vector와 pair를 사용해서 (값, 빈도수)를 저장했다.

의외로 산술평균을 출력하는 곳에서 오류가 발생했다.

처음 시도한 코드는 (int)( (sum/N)+0.5 )를 10진수로 출력하는것이었는데 음수의 경우 원하는 결과가 나오지 않았다.

=> ( (sum/N) + 0.5 )의 결과에 '버림'연산(floor)을 진행한 후에 int형으로 출력하였다.

'BOJ' 카테고리의 다른 글

BOJ 11650번 :: 좌표 정렬하기  (0) 2019.11.24
BOJ 1427번 :: 소트인사이드  (0) 2019.11.23
BOJ 1436번 :: 영화감독 숌  (0) 2019.11.23
BOJ 1018번 :: 체스판 다시 칠하기  (0) 2019.11.21
BOJ 7568번 :: 덩치  (0) 2019.11.21

+ Recent posts