[Python] 백준 알고리즘 온라인 저지 2108 통계학
https://www.acmicpc.net/problem/2108
이번 문제에서도 파이썬의 기본 내장 함수를 주로 사용하였고 최빈값을 구하는 방법이 어려운 문제였다. 최빈값을 구하기 위해 다른 모듈을 가져와 문제를 풀었다.
코드
import sys
from collections import Counter
n = int(sys.stdin.readline())
nums = []
for i in range(n):
nums.append(int(sys.stdin.readline()))
nums.sort()
cnt = Counter(nums).most_common(2)
def sansul(data):
print(round(sum(data) / n))
def jungang(data):
print(nums[len(data) // 2])
def choibin(data):
if len(data) > 1:
if cnt[0][1] == cnt[1][1]:
print(cnt[1][0])
else:
print(cnt[0][0])
else:
print(cnt[0][0])
def bumwee(data):
print(max(data) - min(data))
sansul(nums)
jungang(nums)
choibin(nums)
bumwee(nums)
풀이
우선 함수를 사용하지 않아도 결과에는 전혀 지장이 없다. 이번 문제에서도 시간 초과가 발생할까 봐 sys모듈을 사용하였고 함수로 푼다면 더 빠른 연산이 가능할까라고 생각하게 되어 풀게 되었다. (결과는 빠르지는 않았다.😅)
우선 숫자의 수(n)을 입력받아 n만큼 실행되는 for문으로 nums라는 빈 리스트에 숫자들을 넣는다.
그 후 sort함수를 이용하여 리스트를 정렬하고 각 항목들을 출력하면 된다.
우선 산술평균은 sum으로 리스트의 모든 값을 더하고 n으로 나눠준다. 바로 출력하면 소수점과 함께 나오므로 round로 반올림하여 출력한다.
중앙값은 리스트의 길이를 반으로 나눈 몫의 인덱스를 찾아 출력한다. (문제에서 n은 홀수라고 하였으므로)
가장 문제였던 최빈값은 구글링을 통해 가장 쉬운 방법을 찾아 이용하게 되었다. 함수로 들어가기 전에 cnt를 먼저 선언하고 함수를 사용했다.
최빈값
cnt = Counter(nums).most_common(2) # cnt를 선언하여 빈도수가 가장 큰 두수를 가져온다.
if len(nums) > 1: # nums 리스트의 길이가 1보다 크다면
if cnt[0][1] == cnt[1][1]: # 최빈값 1등과 2등의 빈도수가 같다면
print(cnt[1][0]) # 최빈값을 두번째로 큰 수를 출력
else:
print(cnt[0][0]) # 빈도수가 가장 큰 수가 하나라면 첫번째 수를 출력
else:
print(cnt[0][0]) # 리스트의 길이가 1이라면 그 값 출력
마지막으로 범위는 min함수와 max함수를 이용하여 max-min을 출력하는 것으로 마무리한다.
풀이 결과
'알고리즘' 카테고리의 다른 글
백준 11650번 좌표 정렬하기 파이썬 풀이 (0) | 2022.01.22 |
---|---|
백준 1427번 소트인사이드 파이썬 풀이 (0) | 2022.01.21 |
백준 10989번 수 정렬하기 3 파이썬 풀이 (0) | 2022.01.17 |
백준 2751번 수 정렬하기 2 파이썬 풀이 (0) | 2022.01.16 |
백준 2750번 수 정렬하기 파이썬 풀이 (0) | 2022.01.15 |