1 분 소요

Intro

image

image

문제해결 및 소스코드

#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

/*									<문제해결>
				규칙1. 수의 갯수 1 <= N <= 500,000  N은 홀수
				규칙2. 입력되는 정수의 절대값은 4,000을 넘지 않음.
		
				이문제는 최빈값을 찾는 방법만 생각해낸다면 나머지는 쉽게 풀 수 있는 문제이다.
				
				주어진 규칙에서 문제를 좀 더 쉽게 해결할 수 있는 힌트가 있다. 바로 절대값이 4,000을 넘지 않는다는것.
				
				입력된 수의 빈도를 저장할 배열을 하나 만들고, 입력된 수를 이 배열의 인덱스로 생각하여 
				해당 인덱스의 원소값을 +1 해나간다면 빈도를 구할 수 있을것이다. 
				하지만 -4000부터 -1 까지의 입력을 인덱스로 표현할 수 없으니, -4000부터 -1을 0부터 3999,
				0부터 4000 까지의 입력을 4000부터 8000으로 생각하여 문제를 해결하면 쉽게 해결할 수 있다.
*/

int arr[500001];			// .. 입력된 수를 저장할 배열
int modeNum[8001];			// .. 입력된 수의 빈도를 저장할 배열

// 산술평균
int arrMean(int n)
{
	double sum = 0;					// .. round 함수를 쓰기위한 double형 변수
	for (int i = 0;i < n;i++)
	{
		sum += arr[i];
	}

	return round((sum / n));		// .. 소수점 첫번째 자리에서 반올림
}

// 중앙값
int arrMedian(int n)
{
	int result = arr[n/2];			// .. N이 홀수인 이유
	return result;
}

// 최빈값
int arrMode(int n)
{
	for (int i = 0;i < n;i++)
	{
		modeNum[arr[i] + 4000] += 1;		// .. -4000~-1을 0~3999 으로생각, 0~4000을 4000~8000 으로생각
	}
	
	int theMode = *max_element(modeNum, modeNum + 8001);	// .. 빈도수가 최대인 원소찾기
	int count = 0;											
	int result = 0;

	for (int i = 0;i < 8001;i++)			// .. modeNum을 첫번째 원소부터 순회하며 최빈값인지 비교
	{
		if (modeNum[i] == theMode)
		{
			count++;						// .. 최빈값이라면 result에 저장, count를 증가시켜 다음 최빈값을 구하기
			result = i - 4000;
		}
		// .. 두번째로 작은 최빈값이면 멈추기
		if (count == 2)
		{
			break;
		}
	}
	
	return result;
}

// 범위
int arrRange(int n)
{
	int result = arr[n - 1] - arr[0];
	return result;
}

int main(void)
{

	int n;
	cin >> n;

	for (int i = 0;i < n;i++)
	{
		cin >> arr[i];
	}

	sort(arr, arr + n);				// .. 오름차순 정렬

	cout << arrMean(n) << "\n";
	cout << arrMedian(n) << "\n";
	cout << arrMode(n) << "\n";
	cout << arrRange(n);


	return 0;
}

댓글남기기