상세 컨텐츠

본문 제목

< 백준 BaekJoon : 2108번 통계학 > C++

C++/Baekjoon

by J2on 2022. 7. 16. 00:07

본문

<<문제>>

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

 

2108번: 통계학

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

www.acmicpc.net

 

사실 여섯달 전 갓 병장을 달았을때 풀었던 문제인데...

예제가 추가되어 수정한 김에 올립니다.

 

<<코드>>

#include<iostream>
using namespace std;

/*
  BaekJoon_2108 통계학
산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
*/

double findAverage(int arrN[], int numN){
  double sum=0;
  for(int i=0; i<numN; i++){
    sum += arrN[i];
  }
  
  double result = abs(sum/(double)numN);
  if(sum<0 && result>=1){result *= -1;}
  return result;
}

int findCentor(int arrN[], int numN){
  return arrN[numN/2];
}

int findMode(int arrC[]){
  int max = 0;
  int count = 0;
  int result;
   // 전체를 돌며 최빈값이 하나인지 확인
  for(int i=0; i<8001; i++){
    if(arrC[i] > max){
      max = arrC[i];
      result = i-4000;
      count = 0;
    }
    else if(arrC[i] == max){
      count++;
    }
  } 
   // 하나인 경우에는 바로 출력하고 아닌 경우는 count가 2가되는 경우로 결과값을 설정
  if(count == 0){return result;}
  else {
    count = 0;
    for(int i=0; i<8001; i++){
      if(arrC[i] == max){
      count++;
      }

      if(count == 2){
        result = i-4000;
        break;
      }
    }
    return result;
  }
}

int findRange(int arrN[], int numN){
  int min = arrN[0];
  int max = arrN[numN-1];
  return abs(max-min);
}

int main() {
  int numN;
  scanf("%d", &numN);
  int arrC[8001] = {0,};

  // 계수정렬을 사용
  // 0~8000으로 -4000~4000을 표현하기 위해
  // 0을 arrC에서 4000으로 생각
  int numC;
  for(int i=0; i<numN; i++){
    scanf("%d", &numC);
    arrC[numC+4000]++; // 인풋의 개수들 세기
  }

  int arrN[numN];
  int index = 0;
  for(int k=0; k<8001; k++){
    if(arrC[k] != 0){
      for(int j=0; j < arrC[k]; j++){
        arrN[index] = k-4000;
        index++;
      }
    }
  }

  // 출력
  printf("%.0f \n", findAverage(arrN, numN));
  printf("%d \n", findCentor(arrN, numN));
  printf("%d \n", findMode(arrC));
  printf("%d \n", findRange(arrN, numN));
}

출력에 맞추어 각각 4개의 함수를 설정했습니다.

 

 

유지보수가 쉬운 코드를 짜라는 소리를 많이 들어도 실감이 안났었는데

6개월만에 코드를 다시보니 무슨말인지 확 와닿네요.

 

<<깃헙>>

https://github.com/J2on/BaekjoonOnlineJudge/blob/master/Code/BaekJoon_2108.cpp

 

GitHub - J2on/BaekjoonOnlineJudge: My Study

My Study. Contribute to J2on/BaekjoonOnlineJudge development by creating an account on GitHub.

github.com

 

관련글 더보기

댓글 영역