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


review
N개의 숫자를 입력받아서 산술평균, 중앙값, 최빈값, 범위를 출력하는 문제이다.
1. 산술평균은 전체합을 N으로 나눈 값이다. 소수점 첫째 자리에서 반올림해야 하므로 round 함수를 사용했다. -0.333333 같은 수는 첫째 자리에서 반올림하면 -0으로 출력될 수 있는 점을 주의해야 한다.
2. 중앙값은 <algorithm> 라이브러리의 sort함수를 이용하여 쉽게 구할 수 있었다.
3. 최빈값이 여러 개 있을 경우에 두 번째로 작은 값을 출력해야하는 문제를 가장 해결하기 어려웠다.
정수의 범위가 -4000~4000인 점을 고려하여 8001 크기의 count 배열을 만들었고, 수를 입력받을 때 해당 배열의 값을 증가시키도록 하였다. 첫 번째 반복문에서 최빈값을 구하고, 두 번째 반복문에서 최빈값이 여러 개라고 판단되는 경우에 첫 번째 반복문에서 찾은 값과 같지 않을 때의 값을 저장해 출력하도록 하였다.
4. 범위는 오름차순으로 정렬한 배열에서 최댓값과 최솟값의 차이로 구하였다.
C++ code
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int main(){
int N;
cin >> N;
int num[N];
int sum=0;
int count[8001];
fill(count, count + 8001, 0);
for(int i=0;i<N;i++){
cin >> num[i];
sum+=num[i];
count[4000+num[i]]++;
}
int avg=round((double)sum/N);
cout << avg << endl; //산술평균
sort(num, num+N);
cout << num[(N-1)/2] << endl; //중앙값
int mode=0;
for(int i=0;i<=8000;i++){
if(count[mode]<count[i]){
mode=i;
}
}
for(int i=0;i<=8000;i++){
if((count[mode]==count[i])&&(mode!=i)){
mode=i;
break;
}
}
cout << mode-4000 << endl; //최빈값
int min=num[0];
int max=num[N-1];
cout << max-min << endl; //범위
return 0;
}
result

'Programming > BOJ' 카테고리의 다른 글
| [BOJ] 25206 너의 평점은 (C++) (0) | 2025.05.22 |
|---|