Algorithm

[λ°±μ€€] 2108번 - 톡계학 (C++)

moaoh 2024. 11. 10. 23:38

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

 

 

 

문제

수λ₯Ό μ²˜λ¦¬ν•˜λŠ” 것은 ν†΅κ³„ν•™μ—μ„œ μƒλ‹Ήνžˆ μ€‘μš”ν•œ 일이닀. ν†΅κ³„ν•™μ—μ„œ N개의 수λ₯Ό λŒ€ν‘œν•˜λŠ” κΈ°λ³Έ ν†΅κ³„κ°’μ—λŠ” λ‹€μŒκ³Ό 같은 것듀이 μžˆλ‹€. 단, N은 ν™€μˆ˜λΌκ³  κ°€μ •ν•˜μž.

  1. μ‚°μˆ ν‰κ·  : N개의 μˆ˜λ“€μ˜ 합을 N으둜 λ‚˜λˆˆ κ°’
  2. 쀑앙값 : N개의 μˆ˜λ“€μ„ μ¦κ°€ν•˜λŠ” μˆœμ„œλ‘œ λ‚˜μ—΄ν–ˆμ„ 경우 κ·Έ 쀑앙에 μœ„μΉ˜ν•˜λŠ” κ°’
  3. μ΅œλΉˆκ°’ : N개의 μˆ˜λ“€ 쀑 κ°€μž₯ 많이 λ‚˜νƒ€λ‚˜λŠ” κ°’
  4. λ²”μœ„ : N개의 μˆ˜λ“€ 쀑 μ΅œλŒ“κ°’κ³Ό μ΅œμ†Ÿκ°’μ˜ 차이

N개의 μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, λ„€ κ°€μ§€ κΈ°λ³Έ 톡계값을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 수의 개수 N(1 ≀ N ≀ 500,000)이 μ£Όμ–΄μ§„λ‹€. 단, N은 ν™€μˆ˜μ΄λ‹€. κ·Έ λ‹€μŒ N개의 μ€„μ—λŠ” μ •μˆ˜λ“€μ΄ μ£Όμ–΄μ§„λ‹€. μž…λ ₯λ˜λŠ” μ •μˆ˜μ˜ μ ˆλŒ“κ°’μ€ 4,000을 λ„˜μ§€ μ•ŠλŠ”λ‹€.

좜λ ₯

첫째 μ€„μ—λŠ” μ‚°μˆ ν‰κ· μ„ 좜λ ₯ν•œλ‹€. μ†Œμˆ˜μ  μ΄ν•˜ 첫째 μžλ¦¬μ—μ„œ λ°˜μ˜¬λ¦Όν•œ 값을 좜λ ₯ν•œλ‹€.

λ‘˜μ§Έ μ€„μ—λŠ” 쀑앙값을 좜λ ₯ν•œλ‹€.

μ…‹μ§Έ μ€„μ—λŠ” μ΅œλΉˆκ°’μ„ 좜λ ₯ν•œλ‹€. μ—¬λŸ¬ 개 μžˆμ„ λ•Œμ—λŠ” μ΅œλΉˆκ°’ 쀑 두 번째둜 μž‘μ€ 값을 좜λ ₯ν•œλ‹€.

λ„·μ§Έ μ€„μ—λŠ” λ²”μœ„λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이과정

ν•΄λ‹Ή λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” 결과값이 λ§Žλ‹€λ³΄λ‹ˆ κΌΌκΌΌν•˜κ²Œ 문제λ₯Ό λ³Όν•„μš”κ°€ μžˆμ—ˆλ‹€.

λ¬Έμ œμ— λŒ€ν•œ μ„€λͺ…을 μ œλŒ€λ‘œ μ΄ν•΄ν•˜μ§€λͺ»ν•˜μ—¬ μ‚°μˆ ν‰κ· μ—μ„œ λ¬Έμ œκ°€ μ‘΄μž¬ν•˜μ˜€μ—ˆλ‹€.

 

code

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

using namespace std;

int findMostFrequent(const vector<int>& vec) {
	map<int, int> m;

	for(int num : vec) {
		m[num]++;
	}
	int maxFrequent = 0;
	for(const auto& [num, count] : m) {
		maxFrequent = max(maxFrequent, count);
	}
	vector<int> mostFrequent;
	for(const auto& [num, count] : m) {
		if (maxFrequent == count) {
			mostFrequent.push_back(num);
		}
	}
	sort(mostFrequent.begin(), mostFrequent.end());
	if (mostFrequent.size() >= 2) {
		return mostFrequent[1];
	}
	return mostFrequent[0];
}

int range(const vector<int>& vec) {
	int maxVal = *std::max_element(vec.begin(), vec.end());
	int minVal = *std::min_element(vec.begin(), vec.end());

	return maxVal - minVal;
}

int main() {
	int n, x;
	vector<int> vec;
	double sum = 0;

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> x;
		vec.push_back(x);
		sum += x;
	}
	sort(vec.begin(), vec.end());

	cout << static_cast<int>(round(sum / n)) << endl;	// 평균값 반올림
	cout << vec[n / 2] << endl;							// 쀑앙값
	cout << findMostFrequent(vec) << endl;				// μ΅œλΉˆκ°’
	cout << range(vec) << endl;							// λ²”μœ„

	return 0;
}

 

 

ν›„κΈ°

μ΅œλŒ€ν•œ κΉ”λ”ν•˜κ²Œ 풀이과정을 λ§Œλ“€κΈ°μœ„ν•΄ λ…Έλ ₯을 ν–ˆμ—ˆλ‹€.