문제
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
출력
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
코드
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
int N;
int arr[500001];
int sum = 0;
int max = -4001;
double div1, div2;
int ans1;
int min = 4001;
int arr2[8001] = { 0, }; // 1~4000, 4001~8001
int ans3 = -1;
int num = 0;
int ans3_2;
scanf("%d", &N);
for (int i = 0; i < N; ++i) {
scanf("%d", &arr[i]);
sum += arr[i];
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
arr2[arr[i] + 4000]++;
}
for (int i = 0; i < 8001; ++i) {
if (arr2[i] > ans3) {
ans3 = arr2[i];
ans3_2 = i;
}
}
for (int i = 0; i < 8001; ++i) {
if (arr2[i] == ans3) {
num++;
}
if (num == 2) {
ans3 = i-4000;
break;
}
}
if(num != 2){
ans3 = ans3_2 - 4000;
}
sort(arr, arr + N);
div1 = sum;
div2 = N;
div1 = div1/div2;
ans1 = round(div1);
printf("%d\n", ans1); // 1
printf("%d\n", arr[N / 2]); // 2
printf("%d\n", ans3);
printf("%d\n", max - min); // 3
}
개인적으로 매우 끔찍했던 문제이다. 내가 제일 꺼려하는 문제가 자료형, 소숫점 등으로 장난치는 문제들이다. 너무 이론적인걸 필요로해서 그때마다 구글링하면서 머리를 부여잡는다. (물론 간단한 이론 공부도 필요하다....)
먼저 산술평균의 경우는 고생을 했다. 내가 쓰고있는 IDE가 visual studio인데 얘가 너무 문제들을 쎄게 잡는다. 예를 들어 자료형 변환을 할려하면 정보손실 때문에 뭐라하고 또 다른 IDE에선 잡히지 않는 스택오버플로우를 잡는 등 너무 오바가 심하다;;
그래서 이번 문제만큼은 다른 IDE를 통해 풀었다..... 먼저 sum과 N을 double형 변수에 집어넣어 형변환을 시켜주고 round함수를 통해 반올림을 해 주었다.
그리고 고생이었던게 최빈값인데 작은거에서 두번째여서 반복문 하나를 다시 써주었다.
이 문제에서 핵심은 정수를 사용했다는 점인데 나의 경우엔 4000을 더해주어 -4000~4000의 범위를 0~8000의 범위로 바꿔주었다.
마지막으로 기본적인 자료형 소숫점 등 이론 공부는 제발 하자 제발........
'PS > 기타 알고리즘' 카테고리의 다른 글
[백준 / 11650] (C++) 좌표 정렬하기 (0) | 2022.06.19 |
---|---|
[백준 / 1427] (C++) 소트인사이드 (0) | 2022.03.26 |
[백준 / 10989] (C++) 수 정렬하기 3 (0) | 2022.03.18 |
[백준 / 2750] (C++) 수 정렬하기 (0) | 2022.03.18 |
[백준 / 2751] (C++) 수 정렬하기 2 (0) | 2022.03.18 |