https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
풀이 :
예전에 풀었던 문제인데 재채점 되면서 틀렸다고 나와서 다시 풀어 봄
사실 틀렸다고 나온 이유는 산술 평균 구할 때 -0.xxxx 이런수를 반올림 할 때 -0으로 출력하는 문제 때문에 틀렸던 거였다.
근데 다시 보니 코드가 너무 지저분해서 첨부터 다시 풀었다.
사실 평균값, 중앙값, 범위 값 구하는 것 자체는 그리 어렵지 않다. 입력 받은 수 들을 vector에 push_back 해서 sort 함수로 정렬한 다음 중앙 값, 범위 값을 구했고 입력 받을 때 sum 값을 구해 놓고 / n 해서 평균 값을 구함
조금 어려웠던 부분은 최빈값을 구하는 부분 내가 사용한 방법은 입력 되는 숫자의 범위가 -4000 ~ 4000 이기 때문에 cntArr라는 배열을 만들어 -4000~ -1 까지는 4000~1번째 인덱스에 몇번 나왔는지, 1~ 4000 까지는 4001 부터 8001 번째 인덱스에 몇번 나왔는지 갯수를 카운트 해주었다.
이후에 이 배열의 최대값을 찾고 해당 최대 값을 가지는 index를 tmpVec에 넣고 해당 값들을 다시 복원? 인덱스에 맞게 원래 입력된 수로 복원한 다음에 두 번째로 작은 수를 결과로 리턴해줌! 최대값을 가지는 인덱스가 하나만 있으면 그거만 복원해서 리턴해 주면 된다.
코드 :
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int cntArr[8002] = { 0, };
vector<int> vec;
// 최빈값 구하는 함수
int getMode(int maxEl) {
int rst = 0;
vector<int> tmpVec;
for (int i = 0; i < 8002; i++) {
if (maxEl == cntArr[i]) {
tmpVec.push_back(i);
}
}
if (tmpVec.size() > 1) {
for (int i = 0; i < tmpVec.size(); i++) {
if (tmpVec[i] >= 4001) {
tmpVec[i] -= 4001;
}
else {
tmpVec[i] *= -1;
}
}
sort(tmpVec.begin(), tmpVec.end());
rst = tmpVec[1];
}
else {
rst = tmpVec[0];
if (rst >= 4001) {
rst -= 4001;
}
else {
rst *= -1;
}
}
return rst;
};
int main() {
int n;
cin >> n;
int num;
int sum = 0;
for (int i = 0; i < n; i++) {
cin >> num;
sum += num;
vec.push_back(num);
if (num < 0) {
cntArr[num * -1]++;
}
else {
cntArr[num + 4001]++;
}
}
sort(vec.begin(), vec.end());
int mode = getMode(*max_element(cntArr, cntArr + 8002));
// 산술평균
double avg = round(sum / (double)n);
if (avg == -0) {
avg = 0;
}
cout << avg << '\n';
// 중앙값
cout << vec[n / 2] << '\n';
// 최빈값
cout << mode << '\n';
// 범위
cout << vec[n - 1] - vec[0] << '\n';
}
'baekjoon' 카테고리의 다른 글
[DP] 백준 9251 LCS C++ (0) | 2022.02.15 |
---|---|
[DFS]백준 2644 촌수계산 C++ (0) | 2022.02.06 |
[DP] 백준 1699 제곱수의 합 C++ (0) | 2022.01.26 |
[DP] 백준 2294 동전2 C++ (0) | 2022.01.25 |
[문자열] 백준 5430 AC C++ (0) | 2022.01.24 |
댓글