본문 바로가기
C++ 코딩 문제 풀이/백준

[Baekjoon] 2108번: 통계학

by 섬댕이 2023. 7. 8.

 

 

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

 

2108번: 통계학

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

www.acmicpc.net

 


 

문제 해결 과정

착안

숫자가 입력된 빈도를 나타내기 위한 보조 배열을 선언하여 사용하며, 입력받는 수를 배열에 저장한 다음, 오름차순으로 정렬하여 문제를 해결하고자 하였다.

 

구현

아래와 같이 입력받는 $n$개의 수를 저장한 다음 오름차순으로 정렬하면 간단하게 문제 해결이 가능하다.

 

  • 산술평균: 입력받을 때마다 합을 계산하여 마지막에 $n$으로 나누어 계산(-0 처리에 주의).
  • 중앙값: 정렬된 배열의 중간 인덱스 ($= (n-1) / 2$)의 값을 출력.
  • 최빈값: 빈도를 나타내는 배열에서 빈도 수가 가장 큰 숫자를 구한 다음, 해당 값과 같은 빈도의 다음 수를 탐색.
  • 범위: 정렬된 배열의 마지막 요소와 처음 요소 사이의 차를 출력.

 

[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~

더보기
#include <iostream>
#include <algorithm>
#include <cmath>

#define RANGE 4000

using namespace std;

int Nums[500000];
int Freq[2 * RANGE + 1];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int N, Sum = 0;
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		cin >> Nums[i];
		Sum += Nums[i];
		Freq[Nums[i] + RANGE]++;
	}

	sort(Nums, Nums + N);

	int idx = -1;
	int maxFreq = 0;
	for (int i = 0; i < 2 * RANGE + 1; i++)
		if (maxFreq < Freq[i])
		{
			maxFreq = Freq[i];
			idx = i;
		}

	for (int i = idx + 1; i < 2 * RANGE + 1; i++)
		if (Freq[i] == maxFreq)
		{
			idx = i;
			break;
		}

	int Avg = round((float)Sum / N);
	cout
		<< Avg << "\n"
		<< Nums[(N - 1) / 2] << "\n"
		<< idx - RANGE << "\n"
		<< Nums[N - 1] - Nums[0] << "\n";

	return 0;
}

 

실행 결과

댓글