Priceless

[백준] 2108번: 통계학 (C++) 2트 본문

Algorithm & Test/백준

[백준] 2108번: 통계학 (C++) 2트

Hyun__ 2023. 8. 10. 20:06

 

[백준] 2108번: 통계학 (C++) 1트 (tistory.com)

 

[백준] 2108번: 통계학 (C++) 1트

숫자를 입력 받아 산술 평균 중앙값 두 번째 최빈값 범위 4가지 통계 값을 구하는 문제이다 산술 평균은 반올림을 고려하여 진행하면 된다 중앙값 과 범위는 인덱스를 활용한다 최빈값은 기존에

priceless-hyun.tistory.com

최빈값 문제를 해결하기 못해 해결하지 못했던 문제

최빈값을 구하는 과정에서 새롭게 생각해야 할 부분이 있었다

 

새로운 해결법을 찾기 위해 찾아보던 중

다른 사이트에서는 최대 입력 값이 4000인 것을 고려하여 8000 크기를 가진 배열을 사용하였는데

그 부분이 이해가 가지 않아 다른 풀이를 찾던 중 

아래의 사이트를 참고하였다

백준 2108 통계학 c++ [컴공과고씨] (tistory.com)

 

백준 2108 통계학 c++ [컴공과고씨]

https://www.acmicpc.net/problem/2108 2108번: 통계학 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지

hagisilecoding.tistory.com

 

bool second 변수를 사용하여 첫 번째 최빈값과 두 번째 최빈값을 구분할 수 있었다

int ans 는 최빈값의 빈도를 나타내는 숫자로 가장 빈도가 높은 수가 나타나면 갱신된다

 

최빈값 문제를 해결하고 마지막 예제 입력 값을 넣고 실행했을 때

산술 평균에서 '-0'이 출력되는 문제가 나타났다

이 경우 출력값에 int나 unsigned 를 통한 타입 변경으로 문제를 해결하였다

// baekjoon 2107

#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

// codes for fast I/O
void init(){
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);
}


int main(){
    init();
    
    int n;
    cin >> n;
    
    int arr[500001];
    
    for(int i = 0; i < n; i++){
        cin >> arr[i];
    }
    
    sort(arr, arr+n);
    
    // 산술 평균
    double mean1 = 0;
    
    
    // 최빈값
    int count = 0;
    int ans = 0;
    int temp = arr[0];
    int mean3 = arr[0];
    bool second = false;
    
    
    for(int i = 0; i < n; i++){
        // 산술 평균
        mean1 += arr[i];
        
        // 최빈값
        if(temp == arr[i]){
            count++;
        }
        
        else{
            if(ans < count){
                ans = count;
                mean3 = arr[i - 1];
                second = false;
            }
            else if (ans == count && !second){
                mean3 = arr[i - 1];
                second = true;
            }
            count = 1;
            temp = arr[i];
        }
        
        if(ans < count){
            mean3 = arr[n - 1];
        }
        else if (ans == count && !second){
            mean3 = arr[n - 1];
        }
        
    }
    
    
    cout << int(round(mean1 / n)) << '\n';
    cout << arr[n/2] << '\n';
    cout << mean3 << '\n';
    cout << (arr[n-1] - arr[0]) << '\n';
    
}

이전에 시도했던 방법으로는 배열 두 개를 사용하거나

첫 번째와 두 번째 최빈값과 최빈값의 인덱스를 저장할 변수 4개를 사용하였다

어떻게든 해결할 수 있을 것 같았지만 잘 해결되지 않았다

 

bool 변수를 써서 쉽게 해결할 수 있다는 방법을 보고

세상에 똑똑한 사람이 많다는 것을 새삼 느낀다

공부도 더 열심히 해야겠다는 생각이다