[Python] 백준 - 2108 - 통계학

강주형·2022년 8월 4일
0

백준 알고리즘

목록 보기
12/14

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

최빈값 코드 짜는 게 생각보다 오래 걸렸음

# 2108

N = int(input())
N_list = []

for i in range(N):
    N_list.append(int(input()))


# 산술평균
print(round(sum(N_list)/N))

# 중앙값
if N % 2 == 0: # N이 짝수
    print(sum(sorted(N_list)[N//2:N//2+2])/2)
else: # N이 홀수
    print(sorted(N_list)[N//2])
    

# 최빈값
check = []
count = []
for n in sorted(N_list):
    if n not in check:
        check.append(n)
        count.append(1)
    else:
        for idx, val in enumerate(check):
            if val == n:
                count[idx] +=1
                break

max_N = max(count)
final = []
for i, v in enumerate(count):
    if v == max_N:
        final.append(check[i])

try:
    print(sorted(final)[1])
except:
    print(sorted(final)[0])

# 범위
print(sorted(N_list)[-1] - sorted(N_list)[0])

근데 시간초과 났음..

파이썬의 from collections import Counter 이용

Counter(N_list).most_common()
이렇게 하면 N_list의 원소의 unique와 그 원소들의 빈도수를 튜플로 반환한 값이 나옴
아래 예시

N_list = [-1, -2, -3, -1, -2]
print(Counter(N_list).most_common())
[(-1, 2), (-2, 2), (-3, 1)]

이걸 이용해서 최빈값 구하기 완성!

# 2108

N = int(input())
N_list = []

for i in range(N):
    N_list.append(int(input()))


# 산술평균
print(round(sum(N_list)/N))

# 중앙값
if N % 2 == 0: # N이 짝수
    print(sum(sorted(N_list)[N//2:N//2+2])/2)
else: # N이 홀수
    print(sorted(N_list)[N//2])
    

# 최빈값
from collections import Counter

mc = Counter(N_list).most_common()

final = [mc[0][0]]


for i in range(len(mc)-1):
    if mc[i+1][1] == mc[0][1]:
        final.append(mc[i+1][0])
try:
    print(sorted(final)[1])
except:
    print(sorted(final)[0])

# 범위
print(sorted(N_list)[-1] - sorted(N_list)[0])

근데 또 시간 초과 났음..

input()을 sys.stdin.readline()으로 변경해서 해결

최종

# 2108
import sys

N = int(sys.stdin.readline())
N_list = []

for i in range(N):
    N_list.append(int(sys.stdin.readline()))


# 산술평균
print(round(sum(N_list)/N))

# 중앙값
if N % 2 == 0: # N이 짝수
    print(sum(sorted(N_list)[N//2:N//2+2])/2)
else: # N이 홀수
    print(sorted(N_list)[N//2])
    

# 최빈값
from collections import Counter

mc = Counter(N_list).most_common()

final = [mc[0][0]]


for i in range(len(mc)-1):
    if mc[i+1][1] == mc[0][1]:
        final.append(mc[i+1][0])
try:
    print(sorted(final)[1])
except:
    print(sorted(final)[0])

# 범위
print(sorted(N_list)[-1] - sorted(N_list)[0])
1
4000
4000
4000
4000
0
5
-1
-2
-3
-1
-2
-2
-2
-1
2

Jupyter Notebook에서는 제대로 지원을 안 해서 오류 발생..
다른 방법도 있을까?

profile
Statistics & Data Science

0개의 댓글