www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

// 입력되는 정수의 갯수를 담아놓을 배열
int freqs[8001];

int main(void)
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  // 입력받을 정수들을 쌓아놓는 벡터
  vector<int> v;
  // 각각 답으로 출력할 변수들
  int mean, mid, freq, sco;

  int sum = 0; // 평균을 구하기 위한 총합
  int max = -4000; // 최댓값을 담아놓을 변수
  int min = 4000; // 최솟값을 담아놓을 변수

  int n = 0;
  cin >> n;
  int val;

  for(int i = 0 ; i < n ; i++)
  {
    cin >> val;
    sum += val;
    if(val > max)
    {
      max = val;
    }
    if(val < min)
    {
      min = val;
    }
    freqs[val+4000]++;
    v.emplace_back(val);
  }
  // 최빈값이 몇인지 확인
  int freqmax = 0;
  for(int i = 0 ; i < 8001 ; i++)
  {
    if(freqs[i] > freqmax)
    {
      freqmax = freqs[i];
    }
  }
  // 최빈값들이 얼마나 있는지 확인, 2개 이상으로 넘어갈 시 2번째 값을 넣고 종료
  int count = 0;
  for(int i = 0 ; i < 8001 ; i++)
  {
    if(freqs[i] == freqmax)
    {
      count++;
      freq = i - 4000;
    }
    if(count == 2)
    {
      break;
    }
  }

  sort(v.begin(), v.end());

  mean = int(round(sum / (double)n));
  mid = v[(n-1)/2]; // n 은 항상 홀수!
  sco = max - min; // 사실 v.end() - v.begin() 으로 해도 된다.

  cout << mean << '\n';
  cout << mid << '\n';
  cout << freq << '\n';
  cout << sco << '\n';
}

 

[Try]

1. 산술평균 : 입력받을 때 합을 구해놓고 소숫점을 보고 직접 판별 -> 그냥 cmath 의 round 함수 사용

     중앙값 : 정렬 후 가운데 인덱스로 구한다

     최빈값 : -4000~4000 까지 갯수를 저장하는 배열을 만들어놓고 반복돌려준다

     범위 : 입력받을 때 최대 최소 값을 구해놓는다.

 

[Point]

1. 최빈값 구하는게 넷중에 가장 복잡한 것 같다. 평균과 범위는 너무 단순한 방식이고, 중앙값 역시 sort()만 사용하면 해결되는 문제

     이다. 최빈값을 갯수저장해놓는 배열을 따로 만들어놓는 방식은 입력되는 최대 정수값이 4000 이었으니 가능한 일이지, 몇십만

     정도만 되었어도 사용하지 못했을 것 같다.

2. 최대 최소 값 역시 정렬한 후 벡터의 첫원소와 마지막원소를 사용하면 되는데 불필요하게 입력받을때마다 업데이트해줬다.

3. 최빈값은 다들 비슷한게 푸신 것 같아 마음이 놓인다..

 

[More]

'PS > BOJ' 카테고리의 다른 글

[백준] 2448.py : 별 찍기 - 11  (0) 2020.05.16
[백준] 10989.cpp : 수 정렬하기 3  (0) 2020.05.15
[백준] 11651.cpp : 좌표 정렬하기 2  (0) 2020.05.14
[백준] 7568.cpp : 덩치  (0) 2020.05.14
[백준] 1436.cpp : 영화감독 숌  (0) 2020.05.13

+ Recent posts