[백준] 2108 C++

윤경·2021년 1월 21일
0

Baekjoon

목록 보기
5/64

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>  // accumulate()
#include <cstdlib>  // abs() 절대값 함수
#include <cmath>    // round()
using namespace std;

// 통계학

// long의 범위는 -2,147,483,648 ~ +(동일-1)
// double의 범위는 -1.7*10^308 ~ +동일
int main() {
  long N; // 입력할 수의 개수
  long n; // 입력한 수
  vector<long> v;
  int po[4001] = {0, };  // positive 양수, 0은 여기 포함
  int na[4001] = {0, }; // negative 음수, 숫자를 편하게 매치시키기 위해서 na[0]은 무시


  scanf("%ld", &N);
  for(long i=0; i<N; i++) { // N번 숫자 입력받아서 vector v에 저장
    scanf("%ld", &n);
    v.push_back(n);
    if(n < 0) {             // 동시에 그 숫자들이 몇번 나왔는지 양수, 음수배열로 나누어 체크
      na[abs(n)]++;         // abs()는 절대값 함수
    } else if (n >= 0) {
      po[n]++;
    }
  }

  sort(v.begin(), v.end()); // 원소들을 오름차순 정렬

  // 산술평균
  printf("%.lf\n", round(accumulate(v.begin(), v.end(), 0)/(double)N));
  // round()소수점 첫째 자리에서 반올림 해주는 함수
  // accumulate() 총합을 구해주는 함수
  // 산술평균 얘가 자꾸 결과가 다르게 나와서 엄청 고생했는데 (double)N이 문제였음

  // 중앙값
  printf("%ld\n", v[N/2]);

  // 최빈값
  long max_cnt = 0;                   // 가장 큰 횟수
  long fi_min = 4001, se_min = 4002;  // 첫번째로 작은 값, 두번째로 작은 값
  for(int i=1; i<4001; i++) {         // 음수배열을 도는 코드
    int tar = (i * -1);
    if(na[i] > max_cnt) {
      max_cnt = na[i];              // max_cnt 갱신
      fi_min = tar; se_min = 4002;
    } else if (na[i] == max_cnt) {  // max_cnt 갱신안됨
        if(fi_min > tar) {
        se_min = fi_min;            // fi_min 갱신
        fi_min = tar;
      } else if(fi_min < tar && se_min > tar) { // fi_min < tar < se_min일 때
        se_min = tar;               // se_min 갱신
      }
    }
  }

  for(int i=0; i<4001; i++) {      // 양수배열을 도는 코드
    if(po[i] > max_cnt) {
      max_cnt = po[i];
      fi_min = i; se_min = 4002;
    }
    else if (po[i] == max_cnt) {
      if(fi_min > i) {            // 기존 fi_min보다 작은 수일때
        se_min = fi_min;
        fi_min = i;               // fi_min갱신
      }
      else if (fi_min < i && se_min > i) {
        se_min = i;               // se_min 갱신
      }
    }
  }

  if(se_min == 4002) {        // se_min이 없다는 뜻이므로
    printf("%ld\n", fi_min);  // fi_min값 출력
  } else if(se_min!=4002)
      printf("%ld\n", se_min);

  // 범위
  // sort 되어있기 때문에 간단하게 맨 끝에서 맨 처음을 뺀 수의 절대값으로 나타냄
  printf("%ld\n", abs(v[N - 1] - v[0]));

  return 0;
}
profile
개발 바보 이사 중

0개의 댓글