본문 바로가기
baekjoon

[정렬] 백준 2108 통계학 C++

by HomieKim 2022. 4. 9.

 

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

댓글