728x90
반응형

블로그에 올리는 모든 문제 풀이는 깃허브에 올려져 있습니다.


문제 설명

  • 다음 4가지의 기본 통계 값을 구하는 프로그램을 작성하시오. 단, N(1 <=N <=500,000)은 홀수라고 가정한다.
  • 산술평균 : N개의 수들의 합을 N으로 나눈 값 (소수점 이하 첫째 자리에서 반올림한 값을 출력) 
  • 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  • 최빈값 : N개의 수들 중 가장 많이 나타나는 값 (여러 개 존재 시 두 번째로 작은 값 출력)
  • 범위 : N개의 수들 중 최댓값과 최솟값의 차이
  • 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

풀이 전략

  • 평균: 다 더해서 개수만큼 나눈다.
  • 중앙값: 정렬해서 중앙 인덱스를 출력한다.
  • 범위: 정렬한 벡터의 맨 끝 인덱스 - 맨 앞 인덱스 값
  • 최빈값: 두 가지 풀이로 접근해 보았다.
    1. 배열에 해당 값이 몇 번 나타났는지 + 최빈값이 뭔지 미리 구해놓고 계산
    2. 벡터를 돌면서 최빈값 계산
    메모리와 시간은 2안이 빠르지만 가독성은 1안이 더 좋다.

소스 코드

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

int arr[8001];

using namespace std;
int main()
{
	int x;
	cin >> x;

	int sum = 0;
	int index = 0;
	int max = 0;
	vector<int> list;
	for (int i = 0; i < x; i++)
	{
		int num;
		cin >> num;
		sum += num;

		if (num <= 0)
			index = -num;
		else
			index = 4000 + num;

		arr[index]++;

		if (arr[index] > max)
			max = arr[index];

		list.push_back(num);
	}

	// 평균, 소수점 이하 첫째 자리 반올림
	float avg = sum / (float)x;
	cout << round(avg) << '\n';

	// 중앙값
	sort(list.begin(), list.end());
	cout << list[list.size()/2] << '\n';

	// 최빈값
	//#1
	bool flag = false;
	int result = 0;
	for (int i = -4000; i < 4001; i++)
	{
		if (i <= 0)
			index = -i;
		else
			index = 4000 + i;

		if (arr[index] == max)
		{
			result = i;

			if (flag)
				break;
			flag = true;
		}
	}

	//#2
	//int curNum = 8000;
	//int curCount = 1;
	//int result = 0;
	//int minCount = 0;
	//int sameCount = 0;
	//for (int i = 0; i < list.size(); i++)
	//{
	//	if (list[i] != curNum)
	//	{
	//		curNum = list[i];
	//		curCount = 1;
	//	}
	//	else if (list[i] == curNum)
	//	{
	//		curCount++;
	//	}

	//	if (curCount > minCount)
	//	{
	//		minCount = curCount;
	//		result = list[i];
	//		sameCount = 0;
	//	}
	//	else if (curCount == minCount && sameCount < 1)
	//	{
	//		sameCount++;
	//		result = list[i];
	//	}
	//}

	cout << result << '\n';

	// 범위
	cout << list[list.size() - 1] - list[0];
}

링크

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

 

2108번: 통계학

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

www.acmicpc.net

 

728x90
반응형

'문제풀이 > BOJ' 카테고리의 다른 글

[C++ 백준] 1932 정수 삼각형  (0) 2021.11.22
[C++ 백준] 15650 N과 M (2)  (0) 2021.10.30
[C++ 백준] 1181 단어 정렬  (0) 2021.08.26
[C++ 백준] 18870 좌표 압축  (0) 2021.08.18
[C++ 백준] 11651 좌표 정렬하기2  (0) 2021.06.14