알고리즘/백준

[백준 / Python] 2108번 통계학 | 초코더

cloud_nice 2020. 1. 13. 01:42

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

 

2108번: 통계학

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

www.acmicpc.net

 

접근법

산술평균과 중앙값, 범위은 구하는 법이 매우 간단했습니다.

round()함수로 반올림을 해주고, 평균을 구해주면 됩니다. 만약 원소의 갯수가 짝수개라면 중간값 두개의 산술평균을 구해주면 됩니다.

범위는 max()와 min()을 통해 구함

 

최빈값이 조금 복잡했습니다.

우선 Counter의 most_common()이라는 함수를 이용하면 최빈값을 바로 찾을 수 있었습니다.

most_common(2)를 해주어서 최빈값 2개를 찾아준 후, c[0][1]과 c[1][1]이 같으면(최빈값이 같으면) c[1][0]을 반환 그렇지 않으면 c[0][0] 반환.(정렬되어 있는 리스트에서 최빈값 두개를 차례로 저장해주었으므로 가장 작은 수가 c[0][0]에 그 다음으로 작은 수가 c[1][0]에 저장되어있음)

-> 예를 들면 {(-2:1),(-1:1)} 이런식.

 

그리고 숫자를 numbers.append(int(input()))으로 입력받으면 시간 초과나므로 import sys를 이용해 한줄씩 입력받기

 

 

나의풀이

import sys
from collections import Counter

N = int(input())
numbers=[]
for _ in range(N):
    numbers.append(int(sys.stdin.readline()))

#산술평균
def am(nums):
    return round((sum(nums)/N))
#중앙값
def median(nums):
    mid = nums[len(nums)//2] # nums의 개수는 홀수
    return mid
#최빈값 
def mode(nums):  
    if N == 1:return nums[0]
    c=Counter(nums).most_common(2)
    return (c[1][0] if c[0][1] == c[1][1] else c[0][0])
#범위
def r(nums):return nums[N-1]-nums[0]

numbers.sort()
print(am(numbers))
print(median(numbers))
print(mode(numbers))
print(r(numbers))