문제풀이(Problem Solving)

백준, BOJ, 2108번 C++ [CPP]

게임이 더 좋아 2021. 5. 27. 18:25
반응형
728x170

음 이제부터 무조건 float 절대 안 쓰고.. double 써야징 ㅎㅎ

물론 메모리는 더 먹지만.. float으로 오차가 생기는 것보단 훨씬 낫다.

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

 

 


 

# 맞는 풀이

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

using namespace std;

//산술 평균을 위해 필요한 값 - 원소의 개수, 원소의 합
//최빈값 ""  - 해당 원소의 출현 횟수
//중앙값 - 해당 원소를 내림차순 또는 오름차순으로 정렬 -> but 항상 홀수의 개수를 가지므로 (원소 사이즈 + 1)/2 idx에 존재
//최대,최소 - 원소를 입력받으며 최소 최대값 갱신.

//원소의 개수, 원소의 합을 위한 벡터
vector<int> V;
//최빈값
int num[10001]; //대충 -4000 ~ 4000
//어차피 다 뒤지는데 1만번 연산 밖에 안함.

int main() {
    int n;
    cin >> n;
    double size = n; // 사이즈
    double sum = 0; // 합
    int M, m; // 최대, 최소
    m = 4001;
    M = -4001;

    while (n--) {
        int a;
        cin >> a;
        sum += a; // 합

        if (a < m) m = a; // 최소
        if (a > M) M = a; // 최대

        num[a + 4000] += 1; // 빈도수 -> 음수 인덱스가 없어야 하기 때문.
        V.push_back(a);
    }

    int result = *max_element(num, num + 10000); // 최대 빈도 수 -> 이거 
    int rep; //최빈 값
    int cnt = 0; // 2번째로 작은 값을 위한 조건

    for (int i = 0; i < 8001; i++) {
        if (cnt == 2)break;
        if (num[i] == result) {
            rep = i;
            cnt++;
        }
    }
    rep -= 4000;

    sort(V.begin(), V.end()); // 오름차순 정렬

    cout << round((double)(sum /size)) << "\n";
    cout << V[size / 2] << "\n";
    cout << rep << "\n";
    cout << (M - m) << "\n";

}

728x90
반응형
그리드형