반응형
백준 - 단계별로 풀어보기 [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%로 낮은편이다.
반응형
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준 / BOJ] - 11650번 좌표 정렬하기 C++풀이 (0) | 2020.03.03 |
---|---|
[백준 / BOJ] - 1427번 소트인사이드 C++ 풀이 (0) | 2020.03.03 |
[백준 / BOJ] - 10989번 수 정렬하기 3 C++ 풀이 (0) | 2020.03.03 |
[백준 / BOJ] - 2751번 수 정렬하기2 C++ 풀이 (0) | 2020.03.03 |
[백준 / BOJ] - 2750번 수 정렬하기 C++ 풀이 (0) | 2020.03.03 |