본문 바로가기
백준 문제 풀이 & C++ 공부

백준 2108번 C++

by daisy0461 2022. 8. 7.

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

 

2108번: 통계학

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

www.acmicpc.net

 

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

using namespace std;

int nums[500000];

int main()
{
	int n; double sum = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> nums[i];
		//더하기
		sum += nums[i];
	}

	cout << round(sum / n)  +1 -1 << "\n";		//산술 평균 출력

	stable_sort(nums, nums+n);
	
	cout << nums[n/2] << "\n";		//중앙값 출력

	
	int maxFrequency = -1; int frequency = 0; int frequencyNum;
	int start = 0, end = n; 
	int secNum = 4001;		//최빈값 중 두번째 작은 값을 넣는 변수 -> 절댓값은 4000을 넘지 않아서 4001로 지정 & NULL을 넣으니 오류가 생김

	while(start != end){
		//upper = 초과, lower는 이상
		frequency = upper_bound(nums+start, nums + end, nums[start]) - lower_bound(nums+start, nums+end, nums[start]); //nums[start]에 해당하는 숫자가 몇번 나오는지 알 수 있다.
	
		if(frequency > maxFrequency){           //최빈값을 찾았다!
				maxFrequency = frequency;		//가장 최빈값이라면 maxFrequency에 최빈값을 넣는다.
				frequencyNum = nums[start];
				secNum = 4001;					//최빈값을 찾았기 때문에 두번쨰로 많이 나온 최빈값도 없애줘야한다.
		}
		else if(frequency == maxFrequency)		//많이 나온 횟수가 동일하다!
		{
			if(secNum == 4001){					//두번째로 작은 값이 아직 안들어갔다면
				secNum = nums[start];
			}
		}
		start = upper_bound(nums+start, nums+end, nums[start])  - nums;  //초과하는 인덱스부터 시작하면 되기 때문에.
	}

	if(secNum == 4001){		//최빈값 출력
		cout << frequencyNum << "\n";
	}else{
		cout << secNum << "\n";
	}

	cout << nums[n-1] - nums[0] << "\n";
}

upper_bound와 lower_bound를 사용했던 기억이 있어서 사용해서 풀어보았습니다.

저처럼 푼 사람이 없는거 같네요.. ㅎ..

'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글

백준 1676번 C++  (0) 2022.09.07
백준 1463번 C++  (0) 2022.08.09
백준 1003번 C++  (0) 2021.09.12
백준 11651번 C++  (0) 2021.09.03
백준 11866번 C++  (0) 2021.09.01