본문 바로가기
코딩테스트_백준풀이

통계학 #2108 c++ 풀이

by wanna_dev 2023. 10. 12.

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

 

2108번: 통계학

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

www.acmicpc.net

 

이 문제를 통해 float의 문제점을 알 수 있어서 좋았다.

 

우선 정답이다.

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

using namespace std;



vector<int> v;
vector<int> f;

int listP[4001];
int listM[4001];


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


	int n;
	cin >> n;
	short temp;

	for (int i = 0; i < 4001; i++) {
		listP[i] = -1;
		listM[i] = -1;
	}

	for(int i=0; i<n; i++) {
		cin >> temp;
		v.push_back(temp);
		if (temp >= 0) {
			listP[temp]++;
		}
		else {
			temp *= -1;
			listM[temp]++;
		}
	}
	double  sum = 0;
	for (int i = 0; i < v.size(); i++) {
		sum += v[i];
	}
	double result = round(sum / n);
	if (result == 0) result = 0;
	
	cout << result <<endl;

	sort(v.begin(), v.end());
	 cout << v[v.size() / 2]<<endl;

	
	 int freq = 0; 
	 for (int i = 0; i < 4001; i++) {
		 if (freq < listP[i]) freq = listP[i];
		 if (freq < listM[i]) freq = listM[i];

	}

	 for (int i = 0; i < 4001; i++) {
		 if (listP[i] == freq) f.push_back(i);
		 if (listM[i] == freq) f.push_back((-i));

	 }
	 sort(f.begin(), f.end());
	 if(f.size()>1)
		cout << f[1] << endl;
	 else
		 cout << f[0] << endl;
	


	 cout << v.back() - v.front() << endl;
	return 0;
}

처음에 sum변수를 float으로 설정해서, 틀렸습니다가 계속 나왔다.

 

 

float 형의 부동소수점 문제에 대해서 알아봤다.

https://wannadev.tistory.com/82

 

float vs double c++ 부동소수점 문제

코딩 테스트 문제를 풀던 중 나누기 연산을 해야하는 문제가 있었다. 나누기 연산 후 소수점 아래 N자리 까지 반올림 연산을 해야하기 때문에 float를 사용하여 문제를 해결하고자 하였다. 하지만

wannadev.tistory.com

 

'코딩테스트_백준풀이' 카테고리의 다른 글

블랙잭 #2798 c++ 풀이  (0) 2023.10.12
카드2 #2164 c++ 풀이  (0) 2023.10.12
수 정렬하기3 #10989 c++ 풀이  (1) 2023.10.10
소수 구하기 #1929 c++ 풀이  (0) 2023.10.10
랜선 자르기 #1654 c++ 풀이  (0) 2023.10.06