PS/Baekjoon Online Judge

[백준 2108] 통계학 [C]

kimyoungrok 2021. 7. 28. 15:28

 

백준 - 2108


풀이

최빈값을 구하는게 조금 까다로웠다.

int mode = arr[0], cnt = 1, temp_cnt, temp;
for (int i = 1; i < N; i++){
    if (temp_cnt > cnt){
        mode = arr[i];
        temp_cnt = 0;
    }else if (temp_cnt == cnt)
        temp = arr[i];
			
    if (arr[i] == mode) cnt++;
    else if (arr[i] != arr[i-1]) temp_cnt = 0;
    else temp_cnt++;
}

이후 mode와 temp 중 큰 값을 출력하는 방식으로 Test Case 예제는 통과했으나, 결과는 틀린것으로 나왔다.

때문에 이번 문제는 평범하게 -4000 ~ 4000의 범위에 해당하는 배열을 이용해 풀이했다.

  • -4000 ~ 4000 중 입력받은 수에 해당하는 index의 값을 증가시키고, 최빈값의 개수를 저장했다.
  • -4000부터 저장한 최빈값의 개수를 찾는데, 만약 두 번째 최빈값을 찾는다면 그 값이 최빈값중 두 번째로 작은 값이므로 탐색을 종료하고, 최빈값을 반환한다.

소스코드

#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b){
    int n1 = *(int*)a, n2 = *(int*)b;
    if (n1 < n2)
        return -1;
    else if (n1 > n2)
        return 1;
    return 0;
}
int median(int *arr, int N){
    if (N == 1)
        return arr[0];
    return arr[(N+1) / 2 - 1];
}
int mode(int *arr, int N){
    int num[8001] = {0,}, max = 0, cnt = 0, idx;
    for (int i = 0; i < N; i++){
        num[idx = arr[i] + 4000]++;
        max < num[idx] && (max = num[idx]);
    }
    idx = 0;
    for (int i = 0; i < 8001 ; i++)
        if (num[i] == max)
            if (!cnt){
                idx = i;
                cnt++;
            } else if (cnt == 1){
                idx = i;
                break;
            }
    return idx - 4000;
}
int main(){
    int N, val;
    scanf("%d", &N);
    double sum = 0;
    int arr[N];
    for (int i = 0; i < N; i++){
        scanf("%d", &arr[i]);
        sum += arr[i];
    }
    qsort(arr, N, sizeof(int), compare);
    printf("%.0f\n%d\n%d\n%d\n", sum/N, median(arr, N), mode(arr, N), arr[N-1] - arr[0]);
}

출처 및 참고자료

 

2108번: 통계학

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

www.acmicpc.net

 

산술 평균 - 위키백과, 우리 모두의 백과사전

수학과 통계학에서 산술 평균(算術平均, arithmetic mean)은 주어진 수의 합을 수의 개수로 나눈 값이다. 산술 평균은 수학과 통계학 뿐 아니라, 경제학, 인류학, 역사학 등의 많은 분야에서 빈번하게

ko.wikipedia.org

 

중앙값 - 위키백과, 우리 모두의 백과사전

중앙값(中央-, 영어: median) 또는 중위수(中位數)는 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미한다. 예를 들어 1, 2, 100의 세 값이 있을 때, 2가 가장 중앙에

ko.wikipedia.org

 

최빈값 - 위키백과, 우리 모두의 백과사전

최빈값 위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 2805] 나무 자르기 [C]  (0) 2021.07.29
[백준 01016] 제곱 ㄴㄴ 수 [C]  (0) 2021.07.29
[백준 1966] 프린터 큐 [C]  (0) 2021.07.28
[백준 1904] 01타일 [C]  (0) 2021.07.28
[백준 1929] 소수 구하기 [C]  (0) 2021.07.28