반응형


 

백준 - 단계별로 풀어보기 [2108] 

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

문제

 

 

풀이

 

입력을 받는 시점에 평균을 구할 수 있도록 sum이라는 변수에 값을 더해주고,

-4000~4000의 숫자가 몇번 나왔는지를 저장하는 배열인 numbers[8001]을 활용하여 어떤 숫자가 나오면 해당 인덱스의 값을 증가시켜준다.

 

그 후, 입력받은 숫자들의 벡터를 sort함수를 통해 정렬해주고, 중앙값을 구한다.

범위의 경우에는 이미 오름차순으로 벡터가 정렬되었으므로, 벡터의 back() 값에서 front()값을 빼면 범위가 완성된다.

 

최빈값의 경우 만약 나온 횟수가 같으면 두번째로 작은 수를 출력하라고 하였으므로, not_first라는 bool형 플래그값을 줘서 만약 나온 횟수가 같다면 두번째로 작은 값이 저장되도록 한다.

 

 

코드

 

#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;
}

 

평가

 

최빈값이 여러 개 있을 경우 두번쨰로 작은 수를 출력하라는 예외조건때문에 다소 껄그러웠던 문제이다.

정답률은 27.07%로 낮은편이다.

 

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,