BOJ 2108 C++ 통계학

Algorithm / / 2020. 11. 14. 10:55

BOJ 2108 C++ 통계학

백준 2108 cpp 통계학

 

아이디어

산술평균 : sum / N

중앙값: sort하고 N/2 번째 인덱스에 위치하는 값

범위: 최대값 - 최소값

최빈값:

  1. 음수배열과 양수배열을 따로 선언

  2. 음수배열과 양수배열에 전체 array의 값에 해당하는 인덱스를 저장.

  3. 음수배열 양수배열 모두 돌면서 가장 큰 값을 가진 녀석의 값을 저장해둠(mostFrequentValue라고 하자.)

  4. 다시 한 번 쭉 돌면서 mostFrequentValue와 같은 요소를 만나면

    4.1 음수배열인 경우 isMinus = true로 두고 해당 인덱스를 tempAnswer에 저장. isSecond에 1을 더함. isSecond가 1인데 또 mostFrequentValue를 만나면 해당 인덱스를 바로 리턴하면 됨.

    4.2 양수배열인 경우 isMinus = false로 두고 해당 인덱스를 tempAnswer에 저장. isSecond에 1을 더함. isSecond가 1인데 또 mostFrequentValue를 만나면 해당 인덱스를 바로 리턴하면 됨.

  5. 4번에서 return 되지 않은 경우 최빈값은 하나라는 뜻이므로 isMinus가 true이면 -tempAnswer를 리턴, false이면 tempAnswer를 리턴.

 

#include <bits/stdc++.h>
using namespace std;

int average, center, frequent, range = 0;
int arr[500001];
int N;
int frequencyPlus[4001];
int frequencyMinus[4001];

int getCenter()
{
    sort(arr, arr + N);
    return (arr[(N / 2)]);
}

int getFrequent()
{
    // 음수배열과 양수배열을 따로 만들어 나온 값들을 저장.
    for (int i = 0; i < N; i++)
    {
        if (arr[i] < 0)
            frequencyMinus[-arr[i]]++;
        else
            frequencyPlus[arr[i]]++;
    }
    int mostFrequentValue = 0;
    // 음수배열 양수배열 모두 돌면서 가장 큰 값을 저장해둠(최빈값).
    for (int i = 0; i < 4001; i++)
    {
        mostFrequentValue = max(mostFrequentValue, frequencyMinus[i]);
    }
    for (int i = 0; i < 4001; i++)
    {
        mostFrequentValue = max(mostFrequentValue, frequencyPlus[i]);
    }
    bool isMinus;
    int temporaryAnswerIndex;
    int isSecond = 0;
    for (int i = 4001; i > 0; i--)
    {
        if (frequencyMinus[i] == mostFrequentValue)
        {
            if (isSecond == 1)
            {
                return (-i);
            }
            isMinus = true;
            temporaryAnswerIndex = i;
            isSecond += 1;
        }
    }
    for (int i = 0; i < 4001; i++)
    {
        if (frequencyPlus[i] == mostFrequentValue)
        {
            if (isSecond == 1)
                return i;
            isMinus = false;
            temporaryAnswerIndex = i;
            isSecond += 1;
        }
    }
    if (isMinus)
        return (-temporaryAnswerIndex);
    else
        return (temporaryAnswerIndex);
}

int getRange()
{
    int minimumVal = 2147483647;
    int maximumVal = -2147483648;

    for (int i = 0; i < N; i++)
    {
        minimumVal = min(minimumVal, arr[i]);
        maximumVal = max(maximumVal, arr[i]);
    }
    return (int)(maximumVal - minimumVal);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);


    cin >> N;
    for (int i = 0; i < N; i++)
    {
        cin >> arr[i];
    }
    double sum = 0;
    for (int i = 0; i < N; i++)
    {
        sum += arr[i];
    }
    average = round(sum / N);
    frequent = getFrequent();
    range = getRange();
    center = getCenter();
    cout << average << '\n' << center << '\n' << frequent << '\n' << range << '\n';
}

 

'Algorithm' 카테고리의 다른 글

BOJ 2292 cpp 벌집  (0) 2020.11.17
BOJ 2231 c++ 분해합  (4) 2020.11.16
BOJ 1966 c++ 프린터 큐  (0) 2020.11.13
BOJ 1929 소수 구하기 C++  (0) 2020.11.12
BOJ 1018 체스판 다시 칠하기 c++  (0) 2020.11.09
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom