[c/c++] 백준 2108 (Silver 3)

은동·2023년 3월 2일
0

Baekjoon

목록 보기
35/49

🔨 문제

https://www.acmicpc.net/problem/2108
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
  4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이

N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.


🔨 해결방법

  1. 산술평균은 소수점 이하 첫째 자리에서 반올림한 값을 출력함
    -> 소수점이기 때문에 double형 변수 사용, -0을 피하기 위해 결과값은 int형 변수에 담음

  2. 중앙값
    -> 0부터 입력을 받았으므로 분자가 n이 아닌 n-1로 해야 함

  3. 최빈값
    -> 같은 빈도의 최빈값이 여러개 있을 경우에 두번째로 작은 값을 출력하는게 핵심
    여기서 애를 많이 먹었다

int mode() {
    for (int i = 0; i <= 8000; i++) {	// 입력받은 빈도수 중 최빈값 찾기
        
        if (freq[i] > cnt) {    //가장 작은 최빈값 구하기
            m = i;
            cnt = freq[i];
        }
    }
    for (int i = m+1; i <= 8000; i++) { // 두 번째로 작은 최빈값 구하기
        if (freq[i] == cnt) {	// 같은 빈도수를 가진 최빈값이 있는지, 있다면 해당 값 출력
            m = i;
            break;
        }
    }
    m = m-4000;

    return m;
}
  1. 범위
    -> 범위도 마찬가지로 0부터 입력 받았으므로 n-1 인덱스의 값에서 0 인덱스의 값을 빼주면 된다.

전체적으로 보면 인덱스의 위치를 세심하게 다룰 줄 알고, 변수 선언 및 사용, 구현까지 연습해볼 수 있는 문제이다.


🔨 코드

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int n, sum = 0;
int num[500000] = { 0 };
int freq[500000] = { 0 };
int cnt=0,m=0,result=0;

double arithmeticMean() {
    double arithMean = (double)sum / n; // (sum/n)을 처음에 double로 맞춰놔야 double변수에 저장된다!!

    //소수 n번째 -> 10^(n-1)을 곱하고 나눠주면 됨
    result = round(arithMean);  // return값을 그대로 round(arithMean)으로 넘겨주면 
    // (0 + 0 + (-1)) / 3 = -0.333333...에서 0이 결과값으로 나와야 하지만, -0으로 출력됨
    // int로 변수에 저장하고 출력하면 0이 나옴
    return result;
}
int mode() {
    for (int i = 0; i <= 8000; i++) {
        
        if (freq[i] > cnt) {    //가장 작은 최빈값 구하기
            m = i;
            cnt = freq[i];
        }
    }
    for (int i = m+1; i <= 8000; i++) { // 두 번째로 작은 최빈값 구하기
        if (freq[i] == cnt) {
            m = i;
            break;
        }
    }
    m = m-4000;

    return m;
}

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

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

        freq[num[i] + 4000]++;	//정수의 절댓값이 4000을 넘지 않으므로
    }
    sort(num, num + n);
    
    cout << arithmeticMean() << '\n';
    cout << num[(n-1) / 2] << '\n'; // 0부터 입력을 받았으니 n/2가 아니라 (n-1)/2 구나..
    cout << mode() << '\n';
    cout << num[n-1] - num[0] << '\n';


    return 0;
}
profile
자자 선수입장~

0개의 댓글