실버 3, 수학
문제: https://www.acmicpc.net/problem/2108
문제
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
출력
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
첫번째 풀이 (시간 초과)
import math
N = int(input())
arr = []
for _ in range(N):
arr.append(int(input()))
arr.sort()
print(int("%.0f" %(sum(arr)/N)))
print(arr[N//2])
mostCnt = 0
mostVal = []
for i in range(arr[0], arr[-1]+1):
cnt = arr.count(i)
if cnt > mostCnt:
mostCnt = cnt
mostVal = [i]
elif cnt == mostCnt:
mostVal.append(i)
if len(mostVal) > 1:
print(mostVal[1])
else:
print(mostVal[0])
print(arr[-1]-arr[0])
최빈값을 구할 때 매번 count로 개수를 세어 시간초과가 발생
또한 합은 숫자을 입력 받을 때 마다 더해주면 되므로 수정
-0.33을 소수 1번째 자리에서 반올림 하면 -0 이 되는 파이썬만의 문제를 해결하기 위해 int로 형 변환
두번째 제출 코드 (정답)
from collections import Counter
import sys
input = sys.stdin.readline
N = int(input().strip())
arr = []
S = 0
for _ in range(N):
temp = int(input().strip())
arr.append(temp)
S += temp
arr.sort()
print(int("%.0f" % (S / N))) # 산술평균
print(arr[N // 2]) # 중앙값
# 최빈값
nums = Counter(arr).most_common()
if N > 1:
if nums[0][1] == nums[1][1]:
print(nums[1][0])
else:
print(nums[0][0])
else:
print(arr[0])
print(arr[-1] - arr[0]) # 범위
Counter 모듈을 이용하여 개수를 세어줌
단 most_common()이라는 메소드를 이용하여 딕셔너리를 튜플로 변경
most_common(n) = 가장 많은 것 부터 n 개 출력, 인자 없으면 모두 출력
from collections import Counter
nums = Counter([1, 2, 3, 4, 1, 2])
print(nums)
# Counter({1: 2, 2: 2, 3: 1, 4: 1})
print(nums.most_common())
# [(1, 2), (2, 2), (3, 1), (4, 1)]
print(nums.most_common(3))
# 가장 많은 것 부터 3개 출력
# [(1, 2), (2, 2), (3, 1)]
결과 및 정리
쉬운 문제인줄 알았는데 산술평균할 때 반올림과 최빈값에서 시간을 많이 뺏겼습니다.
Counter 모듈을 통해 쉽게 해결할 수 있었는데 Counter 응용을 자유롭게 하기 위해 Counter를 사용법을 다시 외워야 할 것 같습니다.
'ProblemSolving > Mathematics' 카테고리의 다른 글
백준 4948 베르트랑 공준 (파이썬) (0) | 2022.05.23 |
---|---|
백준 1002 터렛 (파이썬) (0) | 2022.05.22 |
백준 2609 최대공약수와 최소공배수 (파이썬) (0) | 2022.05.12 |
백준 4673 셀프 넘버 (파이썬) (0) | 2022.05.11 |
프로그래머스 k진수에서 소수 개수 구하기 (파이썬) (0) | 2022.05.07 |