[백준-2108] 통계학

이말감·2022년 3월 22일
0

백준

목록 보기
14/49

문제

링크

코드

import sys
from collections import Counter
input = sys.stdin.readline
n = int(input())

value = []
for _ in range(n) :
    value.append(int(input()))
value.sort()

# 산술평균
sAvg = round(sum(value) / n)
print(sAvg)

# 중앙값
mid = (n-1) // 2
print(value[mid])

# 최빈값
if len(value) == 1 :
    print(value[0])
else :
    cnt = Counter(value)
    if len(cnt) == 1 :
        print(cnt)
        print(max(cnt))
    else :
        cnt = cnt.most_common(2)
        print(cnt)
        if cnt[0][1] > cnt[1][1] :
            print(cnt[0][0])
        elif cnt[0][1] == cnt[1][1] :
            print(cnt[1][0])
        
#범위
print(max(value) - min(value))

풀이

산술평균, 중앙값, 범위는 쉽게 풀 수 있었지만, 최빈값을 구하기가 어려웠다.
처음에는 배열.count(찾을 숫자)를 이용해서 풀었는데 시간초과가 나서 Counter를 사용했다.
(2108번 문제 질문을 찾아보니까 for문 안에 count를 쓰게되면 for문에서도 배열 내에 숫자를 하나씩 찾는데, count에서도 루프를 돌면서 찾게 되어 시간 초과가 발생한다고 한다. 링크)

  1. 입력값이 1개이면 그대로 출력
  2. 입력값이 여러 개 일 때 Counter를 이용해서 최빈값을 찾는다.
    2-1. 최빈값 리스트에 값이 1개이면 그대로 출력
  3. 최빈값 리스트에 값이 여러 개이면 최빈값이 가장 큰 순서대로 2개만 저장
    3-1. 개수가 다를 경우 첫 번째 값 출력
    3-2. 개수가 같을 경우 두 번째 값 출력
profile
전 척척학사지만 말하는 감자에요

0개의 댓글