[백준 2108] 통계학

Date:     Updated:

카테고리:

태그:

난이도

실버 III

📜문제

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

🌞풀이

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

using namespace std;

vector<int> v1;
vector<pair<int, int>> v2;

bool compare(pair<int, int> a, pair<int, int > b)
{
	if (a.second == b.second) return a.first < b.first;
	else return a.second > b.second;
}

// 산술평균
void average()
{
	double sum = 0.0;
	int result = 0;

	for (int i = 0; i < v1.size(); i++)
	{
		sum += v1[i];
	}
	result = floor(sum / v1.size() + 0.5);
	if (result == -0) cout << 0 << "\n";
	else cout << result << "\n";
}

//중앙값
void middle()
{
	int result = v1[v1.size() / 2];
	cout << result << "\n";
}

//최빈값
void most()
{
	int cnt = 0;

	v2.push_back(make_pair(v1[0], 0));
	for (int i = 1; i < v1.size(); i++)
	{
		if (v1[i] == v1[i - 1]) cnt++;
		else cnt = 0;
		v2.push_back(make_pair(v1[i], cnt));
	}

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

	if (v2[0].second > v2[1].second) cout << v2[0].first << endl;
	else cout << v2[1].first << endl;
}

// 범위
void range()
{
	int result = v1[v1.size() - 1] - v1[0];
	cout << result << endl;
}

// N이 1인경우
void one_input()
{
	for (int i = 0; i < 3; i++)
	{
		cout << v1[0] << "\n";
	}
	cout << 0 << "\n";
}

int main()
{
	int N = 0;
	int value = 0;

	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> value;
		v1.push_back(value);
	}

	// N이 1인경우
	if (N == 1)
	{
		one_input();
		return 0;
	}
	sort(v1.begin(), v1.end());

	average(); //산술평균
	middle(); // 중앙값
	most(); // 최빈값
	range(); // 범위

	return 0;
}

❗주의

  • 최빈값에서 계속 오류가 났다.

    • pair로 묶고 정렬을 하다보니 first, second에 정확히 어떤 값이 들어가고 어떻게 정렬했는지를 잊고 진행하다보니 오류가 발생한 것 같다.
  • 이번 문제에서는 예외처리를 명시해줘서 해결할 수 있었다. 조금 더 예외처리를 신경쓰고 풀어야 겠다.

맨 위로 이동하기

BOJ 카테고리 내 다른 글 보러가기

댓글남기기