PS 연습

[알고리즘] 백준 문제 풀이 - 2108 통계학

생선묵김치찌개 2022. 4. 23. 19:37
더러워서 화났던 정렬 문제

 

👩🏻‍💻 문제링크

[백준 2108] 더하기 사이클 (cpp)

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

 

2108번: 통계학

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

www.acmicpc.net

✍️ 아이디어

1. 문제 이해

  • 산술평균에서 주의할점 -0이 안나오게 해야함
  • 최빈값 구하기 쉽지 않을것이다

2. 최빈값 구하기

값을 입력 받으면서 그 값에 해당하는 인덱스가 +1 되어 나중에 모든 숫자의 갯수를 찾음

✍️소스코드

불통과

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
vector<int> arr;
int main() {
    int num,tmp,range,middle = 0,most_val,mean = 0;
    int most = -9999;
    int number[8001] = {0,};
    bool not_first = false;
    cin >> num;
    for(int i = 0; i < num; i++)
    {
        cin >> tmp;
        arr.push_back(tmp);
        mean += tmp;
        number[tmp+4000]++;
    }
    sort(arr.begin(),arr.end());
    for(int i = 0; i < 8001; i++)
    {
        if(number[i] == 0)
            continue;
        if(number[i] == most)
        {
            if(not_first)
            {
                most_val = i - 4000;
                not_first = false;
            }
        }
        if(number[i] > most)
        {
            most = number[i];
            most_val = i - 4000;
            not_first = true;
        }
    }
    middle = arr[arr.size()/2];
    mean = round((float)mean / num);
    range = arr.back() - arr.front();
    cout << mean << '\n' << middle << '\n' << most_val << '\n' << range;
}

 

 

다른사람의 코드

-> 뭔가 이런경우에 bool 타입을 쓰는구나 느낌을 알아둬 (가장 작은것에서 2번째니까 그 뒤는 확인할필요가 없게 만들어버림)

 

https://gaeunhan.tistory.com/65

 

[C++ 백준] 2108 통계학

블로그에 올리는 모든 문제 풀이는 깃허브에 올려져 있습니다. 문제 설명 다음 4가지의 기본 통계 값을 구하는 프로그램을 작성하시오. 단, N(1 <=N <=500,000)은 홀수라고 가정한다. 산술평균 : N개의

gaeunhan.tistory.com

 

 

체감난이도 걸린시간 참고 사용 문법
하(구현자체는 쉬움) ? cmath 사용법