문제 링크 : 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 |