문제 출처:https://www.acmicpc.net/problem/2108
문제 |
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최대값과 최소값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
입력 |
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절대값은 4,000을 넘지 않는다.
출력 |
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
1. 산술평균은 소수점 첫째 자리에서 반올림 한 값을 출력해야 하기 때문에 N으로 나눌때 double형으로 나누어 주고 printf출력할때 "%.0f" 로 출력해주면 소수점을 생략하고 반올림하여 출력해줍니다.
2. 중앙값은 N이 홀수이기 때문에 배열이나 벡터를 정렬한뒤 N/2부분을 출력해주면 됩니다.
3. 최빈값은 약간 복잡한데 입력으로 들어오는 정수가 -4000~4000이기 때문에 8001의 크기를 가지는 배열 하나를 선언해주고 -4000~-1까지는 양수로 바꿔주고 바꿔준 값의 배열 인덱스를 +1 해줍니다.
1~4000까지는 +4000을 해주고 그 값의 배열 인덱스를 +1 해줍니다.
이 뒤에 배열의 최대값을 구하고 배열을 전부 탐색하며 최대값을 가진 인덱스를 모두 벡터에 넣어주는데 이 과정에서 1~4000까지는 음수화 해주고 4001~8000까지는 -4000을 해주어야 합니다.
마지막으로 벡터를 오름차순 정렬한뒤 벡터의 사이즈가 1이면 첫번째 값을 출력해주고 사이즈가 1 이상이면 2번째 값을 출력해주면 됩니다.
4. 최대값과 최소값은 입력을 받을때 구해주는게 가장 좋습니다만 중앙값을 구하기 위해 정렬을 수행했으므로 벡터의 첫번째와 마지막 값을 출력해주면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #pragma warning(disable:4996) #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <vector> #include <cmath> #define INF 100000000 using namespace std; bool compare(int a, int b) { return a < b; } int main() { int n, temp, arr[8001], mx = -1, mode, count = 0; double sum = 0; vector<int> vt, mode_vt; for (int i = 0; i < 8001; i++) arr[i] = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &temp); vt.push_back(temp); sum += temp; temp = (temp <= 0) ? abs(temp) : temp + 4000; arr[temp]++; if (arr[temp] > mx) { mx = arr[temp]; mode = temp; } } sort(vt.begin(), vt.end(), compare); for (int i = 0; i < 8001; i++) { if (arr[i] == mx) { mode = i; mode = (mode <= 4000) ? -mode : mode - 4000; mode_vt.push_back(mode); } } sort(mode_vt.begin(), mode_vt.end(), compare); mode = (mode_vt.size() >= 2) ? mode_vt[1] : mode_vt[0]; double eve = sum / double(n); printf("%.0f\n",eve); printf("%d\n", vt[n / 2]); printf("%d\n", mode); printf("%d\n", vt[vt.size()-1] - vt[0]); return 0; } | cs |
'알고리즘 문제 > 수학' 카테고리의 다른 글
[백준] 6064번: 카잉 달력 - C++ (0) | 2019.05.29 |
---|---|
[백준] 1652번: 누울 자리를 찾아라 - python3 (0) | 2019.05.21 |
[백준] 1629번: 곱셈 - C++ (0) | 2018.07.15 |