지-코바

[지코바]3회차 4번문제 풀이

moonseok 2022. 2. 10. 23:48

- 4번 문제

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

 

2108번: 통계학

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

www.acmicpc.net

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

-조건

  1. N(1 ≤ N ≤ 500,000)인 홀수
  2. 입력되는 정수의 절댓값은 4,000

-필요한 알고리즘

   Counting Sort

 


-당님 코드

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

//사용할 변수, 배열 선언
//입력되는 정수가 -4000~4000일 수 이므로 인덱스가 음수가 되는것을 피하기 위해 
//arrayInt 배열을 8001의 크기를 가진 배열로 선언
int arrayNum[500001], arrayInt[8001];
int num,mean,meidan,mode,range;
int sum = 0;

int main() {
    //N입력
    cin >> num;
    for(int i=0; i<num; i++){
        //입력된 N만큼 배열 arrayNum에 정수들 입력
        cin >>arrayNum[i];
        //각 입력된 요소 arrayNum[i]의 합을 sum에 저장
        sum += arrayNum[i];
        //arrayInt배열의 (arrayNum배열의 element) index를 1 증가
        arrayInt[arrayNum[i] + 4000]++;
    }
    	//배열 arrayNum을 입력된 N까지 오름차순으로 정렬 
        sort(arrayNum, arrayNum +num);
	
	int flag;
	int max = 0;
	//가장 많이 등장한 수를 flag에 저장하는 알고리즘
	for (int i = 0; i < 8001; i++)
	{
		//max보다 arrayInt[i]의 element가 크다면
        if (arrayInt[i] > max)
		{
			//max에 arrayInt[i]의 element 저장
            max = arrayInt[i];
            //flag(최빈값+4000)는 i로 저장
			flag = i;
		}
	}

	//최빈값이 2개 이상일 때 두번째로 작은값을 출력하는 알고리즘
    for (int i = flag + 1; i < 8001; i++)
	{
		//max 값과 같은 element를 가진 index가 있다면
        if (arrayInt[i] == max)
		{
			//최빈값을 다시 저장
            flag = i;
			break;
		}
	}
    
   //산술평균( 평균값이 실수일 수 있으므로 round로 반올림 후 mean에 저장) 
   mean = round(double(sum) / num);
   //중앙값 (sort된 arrayNum의 중앙index값을 median에 저장
   meidan = arrayNum[(num-1) / 2];
   //최빈값 (flag가 최빈값 + 4000이므로 다시 4000을 빼준다)
   mode = flag-4000;
   //범위 (sort된 arrayNum의 N-1인덱스 element와 첫번째 element의 차를 range에 저장)
   range = arrayNum[num-1] - arrayNum[0];
   
   
   //출력
   cout << mean << "\n";
   cout << meidan << "\n";
   cout << mode << "\n";
   cout << range << "\n";
    return 0;
}

-참고자료

https://st-lab.tistory.com/104

 

자바 [JAVA] - 카운팅 정렬 (Counting Sort / 계수 정렬)

[정렬 알고리즘 모음] 더보기 1. 계수 정렬 (Counting Sort) - [현재 페이지] 2. 선택 정렬 (Selection Sort) 3. 삽입 정렬 (Insertion Sort) 4. 거품 정렬 (Bubble Sort) 5. 셸 정렬 (Shell Sort) 6. 힙 정렬 (H..

st-lab.tistory.com

 

'지-코바' 카테고리의 다른 글

[지코바] 6회차 문제풀이  (0) 2022.04.14
[지코바] 5회차 문제풀이 - 홍님  (0) 2022.03.31
[지코바] 3회차 문제풀이  (0) 2022.02.03
[지코바] 2회차 문제풀이  (0) 2022.01.14
[지코바] 12/10 문제풀이  (0) 2021.12.10