[백준 / BOJ] 2108번 통계학 (C++, Python)◎ 자료구조와 알고리즘/백준(BOJ) 문제풀이2022. 5. 31. 13:16
Table of Contents
반응형
링크 : https://www.acmicpc.net/problem/2108
문제
문제 풀이
최빈값이 여러 개 있을 경우에 두 번째로 작은 값을 출력해야 해서 생각할 거리가 있었던 문제다.
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 코드 전문
소감
반응형
'◎ 자료구조와 알고리즘 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 / BOJ] 11650번 좌표 정렬하기 (C++, Python) (0) | 2022.05.31 |
---|---|
[백준 / BOJ] 1427번 소트인사이드 (C++, Python) (0) | 2022.05.31 |
[백준 / BOJ] 10989번 수 정렬하기 3 (C++, Python) (0) | 2022.04.14 |
[백준 / BOJ] 2751번 수 정렬하기 2 (C++, Python) (0) | 2022.04.14 |
[백준 / BOJ] 2750번 수 정렬하기 (C++, Python) (0) | 2022.04.13 |
@Reo :: 코드 아카이브
자기계발 블로그