본문 바로가기
백준 코딩테스트/실버

2108) 통계학 (C++)

by xortl98 2022. 5. 8.
728x90

 출처 

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 내 풀이 

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

//첫번째 int = 몇개나 나왔는지, 두번째 int = 값 
bool compare(pair<int, int>x, pair<int, int>y)
{
	//동일하게 나왔으면 오름차순으로 
	if (x.first == y.first)
	{
		return x.second < y.second;
	}
	//그 외는 숫자들은 내림차순 
	return x.first > y.first;
}

//함수들 
void result1();
void result2();
void result3();
void result4();

int N = 0;
int input = 0;
vector<int>v;

//최빈값 비교 변수
int minusNum[4001];
int plusNum[4001];
vector<pair<int, int>>v2;

int main()
{
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		cin >> input;
		v.push_back(input);

		//최빈값 비교 위해서 넣어줌 
		if (input < 0)
		{
			input *= -1;
			minusNum[input]++;
		}
		else plusNum[input]++;

	}
	sort(v.begin(), v.end());

	result1();
	result2();
	if (N == 1) printf("%d\n", v[0]);
	else result3();
	result4();
}

//평균값 첫째 자리 반올림 출력 
void result1()
{
	double result = 0;
	for (int i = 0; i < N; i++)
	{
		result += v[i];
	}
	result /= N;

	//~0.5 ~ 0 사이일때 -0으로 출력되는 경우 처리 
	if (result > -0.5 && result < 0.5) result = 0;
	printf("%.f\n", result);
}

//중앙값 출력
void result2()
{
	int middle = (N - 1) / 2;
	printf("%d\n", v[middle]);
}

void result3()
{
	for (int i = 0; i < 4001; i++)
	{
		//하나라도 들어갔다면 몇번 나왔는지, 해당 숫자 벡터에 넣음 

		if (minusNum[i] != 0)
		{
			v2.push_back({ minusNum[i],-i });
		}

		if (plusNum[i] != 0)
		{
			v2.push_back({ plusNum[i],i });
		}
	}

	sort(v2.begin(), v2.end(), compare);

	//만일 최빈값이 동일하면 2번째값 출력 
	if (v2[0].first == v2[1].first)
	{
		printf("%d\n", v2[1].second);
	}
	else printf("%d\n", v2[0].second);
}

void result4()
{
	//가장 작은 값이 0보다 작으면 양수로 변경 
	//ex) -8 2 -> 2 + 8 = 10, -5 -1 = -1 + 5 = 4 
	if (v[0] < 0)
	{
		v[0] *= -1;
		printf("%d", v[N - 1] + v[0]);
	}
	else printf("%d", v[N - 1] - v[0]);
}

 해설

첫번 째 줄 정답은 N개의 수들의 합을 N으로 나눈 평균값을 출력해 주었다. (double로 출력값을 선언해야 틀리지 않음)

 

두번 째 줄은 N은 홀수이기 때문에 정렬후 (N-1)/2번째 값을 찾으면 된다.

 

세번 째 줄은 벡터를 쌍으로 지정해 첫번 째에는 얼마나 나왔는지, 두번 째에는 변수 값을 저장을 저장해준 뒤 

compare 함수로 직접 첫번 째 값이 같으면 변수 값 오름 차순으로, 그 외에는 얼마나 나왔는지에 대한 내림차순으로 비교해주었다. 

 

네번 째 줄은 범위가 가장 작은수가 음수일 경우 양수로 변경해준 뒤 범위가 큰 값과 작은수를 더해주고 그 외에는  

범위가 가장 큰 값과 작은 값을 빼주었다. 

 느낀점 

정렬 생각보다 너무 어렵다.

'백준 코딩테스트 > 실버' 카테고리의 다른 글

1427) 소트인사이드 (C++)  (0) 2022.05.08
9012) 괄호 (C++)  (0) 2022.05.08
10989) 수 정렬하기 3 (C++)  (0) 2022.05.07
2751) 수 정렬하기 2 (C++)  (0) 2022.05.07
10866) 덱 (C++)  (0) 2022.05.07