#작성 코드
#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 |