백준 2108 통계학

CJB_ny·2023년 1월 5일
0

백준

목록 보기
40/104
post-thumbnail

통계학

이문제 푸는데 시간 너무 많이 걸림...

오래걸려서 다른 문제 풀려고했는데 오기가 생겨서 계속하다가 결국 내일 다시 보기로한 문제임.

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <cmath>
using namespace std;
#define endl "\n"

int n, mean, middle, most, range, cnt[8002];
vector<int> vec;
vector<int> most_qq;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n;
	int m;
	int sum = 0;
	for (int i = 0; i < n; ++i)
	{
		cin >> m;
		if (m > 0) ++cnt[m + 4000];
		else if (m < 0) ++cnt[m * -1];
		else ++cnt[0];
		vec.push_back(m);
		sum += m;
	}

	mean = round((float)sum / n);
	sort(vec.begin(), vec.end());
	middle = vec[vec.size() / 2];

	int mx = -1;
	int idx = 0;
	bool flag = false;
	int most_v = -4001;
	for (int i = 0; i < 8001; ++i)
	{
		if (cnt[i] == 0) 
			continue;
		
		if (mx < cnt[i])
		{
			flag = true;
			mx = cnt[i];
			idx = i;

			if (idx <= 4000) idx *= -1;
			else idx -= 4000;
		}
		else if (mx == cnt[i])
		{
			flag = false;
			int temp = 0;
			
			temp = i;

			if (temp <= 4000) temp *= -1;
			else temp -= 4000;

			most_qq.push_back(temp);
			most_qq.push_back(idx);
		}
	}
	
	sort(most_qq.begin(), most_qq.end());

	if (vec.size() == 1)
	{
		most = vec[0];
	}
	else
	{
		if (flag)
		{
			most = idx;
		}
		else
		{
			int temp = most_qq[0];
			for (int i = 0; i < most_qq.size(); ++i)
			{
				if (temp != most_qq[i])
				{
					most = most_qq[i];
					break;
				}
			}
		}
	}

	range = vec.back() - vec.front();

	cout << mean << endl;
	cout << middle << endl;
	cout << most << endl;
	cout << range << endl;

	return 0;
}

일단 이런식으로 했는데 당연히 틀렷습니다 임.

맞은 cPP 코드

#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
#define endl "\n"

int n, mean, mid, most, range;
vector<int> vec;
int arr[8001];

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	cin >> n;

	int sum = 0;
	vec.reserve(n);
	for (int i = 0; i < n; i++)
	{
		int val;
		cin >> val;
		sum += val;
		vec.push_back(val);
		if (val < 0) val *= -1;
		else if (val > 0) val += 4000;
		++arr[val];
	}
	
	sort(vec.begin(), vec.end());
	
	int Max = 0;
	int tmp = 0;
	bool flag = false;
	for (int i = 0; i < 8001; ++i)
	{
		if (Max < arr[i])
		{
			flag = false;
			tmp = i;
			Max = arr[i];
		}
		else if (Max == arr[i]) flag = true;
	}

	vector<int> ms;
	if (flag)
	{
		for (int i = 0; i < 8001; ++i)
		{
			if (Max == arr[i])
			{
				int t = i;
				if (t <= 4000) t *= -1;
				else t -= 4000;
				ms.push_back(t);
			}
		}

		sort(ms.begin(), ms.end());
		most = ms[1];
	}
	else
	{
		if (tmp <= 4000) tmp *= -1;
		else tmp -= 4000;

		most = tmp;
	}
	
	mean = round((float)sum / n);
	mid = vec[vec.size() / 2];
	range = vec.back() - vec.front();

	cout << mean << endl;
	cout << mid << endl;
	cout << most << endl;
	cout << range << endl;

	return 0;
}

좀 길고 더러운데

길어진 부분이 최빈값 찾는 부분이다.

flag라는 불값으로 최빈값이 한개인지 여러개인지 체크후 vector하나 ms더 만들어서 이곳에 arr의 인덱스를 밀어넣음.

이후 ms를 sort한뒤 제일 앞에서 1번째 값을 꺼내옴.

후기

첫번째 코드는 23/01/05에 만든부분인데
아래코드 23/01/06에 한게 길기는 하지만 그나마 어제한거보다는 조금 간결하고 나은듯..??

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글