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