[백준] 2108: 통계학 - 파이썬[python]

다인·2024년 10월 17일

백준

목록 보기
82/112
post-thumbnail

코드

import sys
input = sys.stdin.readline

N = int(input())
lst = []
dic = dict()

for _ in range(N):
    n = int(input())
    lst.append(n)
    if n in dic:
        dic[n] += 1
    else:
        dic[n] = 1

# 산술값
print(round(sum(lst)/N))

# 중앙값
lst.sort()
print(lst[N//2]) # 인덱스는 0부터

# 최빈값
dic = dict(sorted(dic.items()))

count = max(dic.values())
numbers = []
for key, value in dic.items():
    if value == count:
        numbers.append(key)

if len(numbers) == 1:
    print(numbers[0])
else:
    print(sorted(numbers)[1])

# 범위
print(lst[-1]-lst[0])
  • set과 dictionary는 순서가 없기에 조금 고민했다. 시간을 위해 set을 사용하려다가 중앙값 때문에 리스트로 바꾸었다. 빈도를 저장하기 위해 dict도 사용하기로 했다.(다행히 다른 분들 코드도 딕셔너리다)

산술값

print(round(sum(lst)/N))
  • round는 반올림해주는 함수로 두 번째 인자가 없으면 소수 첫째 자리에서 반올림한다. 두 번째 인자가 0으로 자동으로 되는 것이다. 두 번째 인자에 2를 넣어주면 소수 셋째 자리에서 반올림한다.(round는 내장함수로, 올림이나 내림을 사용하고 싶으면 math를 import해서 ceil과 floor를 사용하자)

중앙값

lst.sort()
print(lst[N//2]) # 인덱스는 0부터
  • 처음에 단순히 (N+1)//2 했다가 틀렸다.. 인덱스이니 저거보다 1 작다. 그러니 N//2를 써 주면 된다.

최빈값

dic = dict(sorted(dic.items()))

count = max(dic.values())
numbers = []
for key, value in dic.items():
    if value == count:
        numbers.append(key)

if len(numbers) == 1:
    print(numbers[0])
else:
    print(sorted(numbers)[1])
  • 이 문제의 포인트라고 생각되는 최빈값이다.
  • 딕셔너리를 사용하는 건 쉽게 떠올렸다. 그치만! 오랜만에 딕셔너리를 쓰니 다 까먹었더라.. 완전히 내 게 되지 않았다는 뜻이겠지.

  • 어디는 dic.items()를 쓰고 어디는 dic.values()를 썼다. 이번 기회에 이걸 싹 정리해보자.
    • dic는 딕셔너리의 key들만 반환한다.
    • dic.items()key와 value 쌍을 튜플로 반환한다. (함수 이름 땜에 첨엔 헷갈렸다.. values처럼 쟤도 key들만 반환하는 줄.. 그래서 이름이 items구나? 아하........)
    • dic.values()value들만 반환한다.

  • dic, dic.items(), dic.values()는 모두 뷰 객체로 반환된다. 예를 들어 print(dic.values())하면 dict_values([1, 2]) 이렇게 출력된다.
  • 리스트가 아닌 뷰 객체이지만 max함수는 사용 가능하다. max는 반복 가능한 객체이면 다 가능하기 때문이다.

범위

print(lst[-1]-lst[0])

이렇게 써 주었지만 아래도 가능하겠다. 그치만 정렬을 이미 해주어서 위가 더 빠르지 않을까..?

print(max(lst)-min(lst))

결과

0개의 댓글