[백준 2108] 통계학 해설 및 풀이 (파이썬)Python2021. 12. 20. 16:00
Table of Contents
백준 알고리즘 2108 | 통계학
https://www.acmicpc.net/problem/2108
최근에 구현 문제를 풀기 시작했는데, 재미있네요 ㅋㅋ
- 산술평균 : N개의 수들의 합을 N으로 나눈 값 (반올림)
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
입력된 값을 다음과 같이 출력해야하는 문제입니다.
시간초과
이 문제가 시간 초과가 뜬다면, 다음을 확인해주세요.
1. sys.stdin.readline()을 사용하는가?
input보다 속도면에서 확연한 차이를 보입니다.
readline으로 입력을 받으세요.
2. 시간 복잡도가 높은가?
아마도 최빈값에서 시간 복잡도가 높아질텐데, N(O)로 처리되게 해보세용.
틀렸습니다
산술 평균 :
여기서는 반올림이 문제가 될 수 있습니다.
파이썬의 round()함수는 우리가 실생활에서 사용하는 반올림이 아닙니다.
위를 모르신다면 반올림을 사용하는 문제를 만났을 때 불이익을 볼 수 있습니다.
중앙값 :
중앙값은 sort후에 중간에 있는 수만 가져오면 됩니다.
항상 주어지는 값은 홀수라는 조건이 있기에,
짝수개가 주어졌을 때는 생각하지 않아도 됩니다.
최빈값 :
이부분이 이 구현문제의 핵심입니다.
N(O)를 목표로 구현해보세요.
범위 :
여기서 틀리실 일은 적겠지만..
글을 다시 한번 읽어보시면 풀 수 있으실겁니다.
코드
import sys
n = int(sys.stdin.readline())
nums = []
for _ in range(n):
nums.append(int(sys.stdin.readline()))
# 산술평균 : N개의 수들의 합을 N으로 나눈 값 (반올림)
a = int(sum(nums))
if a >= 0:
print(int(sum(nums) / n + 0.5))
elif a < 0:
print(int(sum(nums) / n - 0.5))
# 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
nums.sort()
print(nums[int(n/2)])
# 최빈값 : N개의 수들 중 가장 많이 나타나는 값
highs = [nums[0]]
cnt = 1
high = 0
last = nums[0]
idx = 0
for i in nums[1:]:
if i != last:
if cnt > high:
highs = []
highs.append(last)
high = cnt
elif cnt == high and last not in highs:
highs.append(last)
cnt = 1
else:
cnt += 1
last = i
idx += 1
if cnt > high:
highs = [last]
elif cnt == high and last not in highs:
highs.append(last)
cnt = 1
if len(highs) == 1:
print(highs[0])
else:
print(highs[1])
# 범위 : N개의 수들 중 최댓값과 최솟값의 차이
print(abs(nums[-1] - nums[0]))
'Python' 카테고리의 다른 글
[파이썬] itertools, 완전탐색을 공부합시다. (0) | 2022.03.02 |
---|---|
[파이썬 모듈 collections] deque 큐의 이해, 사용법 (0) | 2021.12.21 |
[파이썬] 반올림 구현하기, 반올림 사사오입 구현 (2) | 2021.12.17 |
[파이썬] Input, sys.studin.readline 입력 값 시간 줄이기 (0) | 2021.12.16 |
[파이썬] 0으로 이루어진 리스트 만들기 (0) | 2021.12.15 |
@임채성 :: 푸르고 개발 블로그
글 내용 중 잘못되거나 이해되지 않는 부분은 댓글을 달아주세요! 감사합니다! 문의: puleugo@gmail.com