◎ 자료구조와 알고리즘/백준(BOJ) 문제풀이

[백준 / BOJ] 2108번 통계학 (C++, Python)

Reo 2022. 5. 31. 13:16
반응형

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

 

2108번: 통계학

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

www.acmicpc.net


문제


문제 풀이

최빈값이 여러 개 있을 경우에 두 번째로 작은 값을 출력해야 해서 생각할 거리가 있었던 문제다.

 

C++ 상세 풀이

더보기

최빈값이 여러 개 있을 경우에 두 번째로 작은 값을 출력해야 해서 생각할 거리가 있었던 문제다.

 

숫자 범위가 -4000 ~ 4000이므로 최빈값을 계산할 벡터를 8001사이즈로 선언해주고, cnt[v[i] + 4000]++;로 최빈값을 카운트해준다. Line 27부터는 현재의 최빈값을 cntmax에 저장하고 해당 인덱스를 val에 저장한다. >=가 아닌 >이므로 가장 크기가 작은 최빈값이 저장되어있을 것이고, 두 번째로 작은 최빈값을 출력해야 하니 저장해놨던 인덱스 val + 1부터 다시 탐색한다.

 

for (int i = 0; i < N; ++i)  {
    cin >> v[i];
    sum += v[i]; // 총합 계산

    cnt[v[i] + 4000]++; // 최빈값 저장
}

sort(v.begin(), v.end());

// 최빈값 중 가장 작은 값
for (int i = 0; i <= 8000; ++i) {
    if (cnt[i] > cntmax) {
        cntmax = cnt[i];
        val = i;
    }
}

// 두 번째로 작은 최빈값을 구해야 한다.
// 이미 위에서 가장 작은 최빈값을 찾아놨으므로 val + 1부터 탐색한다.
for (int i = val + 1; i <= 8000; ++i) {
    if (cnt[i] == cntmax) {
        val = i;
        break;
    }
}
sum = round(double(sum) / N);

Python 상세 풀이

더보기

파이썬에는 collections라는 좋은 모듈이 있기 때문에 활용해보았다.

 

cnt = Counter(arr).most_common(2)

print(round(sum(arr) / N)) # 산술평균
print(arr[(N - 1) / 2]) # 중앙값
if N > 1: # 최빈값
    if cnt[0][1] == cnt[1][1]:
        print(cnt[1][0])
    else:
        print(cnt[0][0])
else:
    print(cnt[0][0])
print(max(arr) - min(arr)) # 최대 최소 차이

 

C++ 코드 전문

 

Python 코드 전문

 

소감

 

반응형