본문 바로가기

Algorithm/문제풀이

[백준] 2108번: 통계학

문제 링크https://www.acmicpc.net/problem/2108

 

문제 풀이

- 산술평균 : 데이터를 입력받을 때 합계를 미리 구해놓고 round함수를 이용해 반올림하여 출력한다.

- 중앙값 : algorithm 헤더파일을 선언하고, sort() 함수를 이용해 데이터를 정렬한 후 가운데 인덱스에 해당하는 값을 출력한다.

- 최빈값 : 문제를 보면 데이터는 절대값 4000을 넘지 않는다는 조건이 있다.

그 말은, -4000 ~ 4000의 범위에만 데이터가 존재한다는 뜻이다.

0 포함 8001개의 데이터를 위한 카운트 배열을 할당하고, 각 숫자가 몇 번 입력되는지 저장한다.

카운트 배열을 돌면서 가장 많이 나타나는 값을 구한다.

단, 최빈값이 여러 개인 경우에는 두번째로 작은 값을 출력해야 하므로 최빈값이 한번 더 나타나는 경우 별도로 체크한다.

- 범위 : 위에서 데이터를 정렬했으므로, (배열의 끝 값 - 첫번째 값)을 출력한다.

 

소스코드

/*
 * 백준 2108번: 통계학
 */

#include <iostream>
#include <algorithm>
#include <cmath>

#define MAX 8001

using namespace std;

int main() {
	int N;
	cin >> N;

	int count[MAX] { 0, };

	int* arr = new int[N];
	int sum = 0;
	for (int i = 0; i < N; i++) {
		cin >> arr[i];
		sum += arr[i];
		count[arr[i] + 4000]++;
	}

	sort(arr, arr + N);

	// 산술평균
	cout << round(sum / (double)N) << endl;
	
	// 중앙값
	cout << arr[N / 2] << endl;
	
	// 최빈값
	int max = 0;
	int second = 0;
	bool second_check = false;
	for (int i = 0; i < MAX; i++) {
		if (count[i] > max) {
			max = count[i];
			second = i - 4000;
			second_check = false;
		}
		else if (count[i] == max && !second_check) {
			second = i - 4000;
			second_check = true;
		}
	}

	cout << second << endl;

	// 범위
	cout << arr[N - 1] - arr[0] << endl;

	return 0;
}

 

'Algorithm > 문제풀이' 카테고리의 다른 글

[백준] 1181번: 단어 정렬  (0) 2019.06.09
[백준] 1427번: 소트인사이드  (0) 2019.06.09
[백준] 10989번: 수 정렬하기3  (0) 2019.06.08
[백준] 2750번: 수 정렬하기  (0) 2019.05.23
[백준] 6064번: 카잉 달력  (0) 2019.05.22