알고리즘

[BOJ] 2108 통계학

졔졔311 2023. 5. 25. 18:34
728x90
반응형

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

---------------------------------------------------핵심 알고리즘--------------------------------------------

 

정렬 + a

 

---------------------------------------------------풀이----------------------------------------------------

 

산술평균 : sum / N. 소수점 이하 첫째 자리에서 반올림한 값이므로, round()를 사용하였다.

그럼 마지막 예제에서 (-1)/3 = -0.3333이고, 이 값의 반올림 값으로 -0이 출력된다.

이 값을 0으로 만들기 위해, (int)로 타입캐스팅 해주었다.

 

중앙값 : sort()한 뒤 arr[N/2]의 값.

 

최빈값 : 값의 범위가 -4000~+4000이므로, 실제 값에 +4000을 한 값의 개수를 cnt[]에 저장한다.

예를 들어, -20이면 cnt[-20+4000]을 1 증가시키고, 40이면 cnt[40+4000]을 1 증가시킨다.

cnt[]를 arr[]+4000의 최솟값부터 최댓값까지 보면서 cnt[]의 값이 최대인 인덱스를 찾는다.

만약, 최대와 같은 값이 발견되면 그때의 인덱스 값이 최빈값이 된다.

최대와 같은 값의 세 번째 이상부터는 최빈값을 업데이트하지 않는다.

 

범위 : 최댓값-최솟값. 이미 sort()를 적용했으므로, arr[N-1]-arr[0]와 같다.

#define FASTIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>

using namespace std;

int main(void){
    FASTIO;
    int N;
    cin >> N;
    // input
    int arr[500'001] = {0, };
    // 최빈값을 찾기 위해 각 숫자의 개수 세기(실제숫자+4000)
    int cnt[10000] = {0, };
    int total = 0;
    for(int i = 0; i < N; i++){
        cin >> arr[i];
        total += arr[i];
        cnt[arr[i]+4000]++;
    }
    // 산술평균
    cout << (int)round((double)total/(double)N) << "\n";
    // 중앙값
    sort(arr, arr+N);
    cout << arr[N/2] << "\n";
    
    // 최빈값
    int max_freq = 0;       // cnt 최댓값
    int max_freq_num = 0;   // cnt가 최대인 수. 최빈값
    int max_freq_cnt = 0;   // cnt 최댓값의 개수
    for(int i = arr[0]+4000; i <= arr[N-1]+4000; i++){
        if(cnt[i] > max_freq){
            max_freq = cnt[i];
            max_freq_num = i-4000;
            max_freq_cnt = 1;
        }
        else if(max_freq_cnt == 1 && cnt[i] == max_freq){
            max_freq_num = i-4000;
            max_freq_cnt++;
        }
    }
    cout << max_freq_num << "\n";

    // 범위
    cout << arr[N-1]-arr[0] << "\n";
    return 0;
}

 

---------------------------------------------------후기----------------------------------------------------

 

어려운 문제는 아닌데, average 출력 부분 조건이 조금 까다롭다고 생각해서 써두는 후기.

728x90
반응형

'알고리즘' 카테고리의 다른 글

[BOJ] 7568 덩치  (2) 2023.05.26
[BOJ] 4949 균형잡힌 세상  (0) 2023.05.26
[BOJ] 1966 프린터 큐  (0) 2023.05.25
[BOJ] 1929 소수 구하기  (2) 2023.05.25
[BOJ] 10814 나이순 정렬  (0) 2023.05.24