문제
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
출력
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
문제 풀이
먼저, 각 값들을 구하기 위해 입력 받은 수들을 list에 삽입해줍니다.
1. 산술평균
산술 평균은 수들을 모두 더한 값을 n으로 나눈 값입니다.
따라서 sum() 함수를 이용해 list 원소들의 합을 구해주고 n으로 나누어주었습니다.
이때, 소수점 이하 첫째 자리에서 반올림한 값을 출력하기 위해
round() 함수를 이용했습니다.
round() 함수는 반올림한 값을 출력해주는 함수입니다.
2. 중앙값
중앙값은 수들을 오름차순으로 정렬했을 때
중앙에 위치하는 값을 구하는 것입니다.
따라서 sort() 함수를 이용해 수들을 오름차순으로 정렬해주고
index의 처음과 끝값을 더한 (n - 1)을 2로 나누어주어 중앙값의 index를 구해주었습니다.
따라서 해당 index의 값을 출력하면 중앙값을 구할 수 있습니다.
3. 최빈값
최빈값은 N개의 수들 중 가장 많이 나타나는 값을 구하는 것입니다.
최빈값을 구하는 것이 가장 까다로웠습니다.
이를 해결하기 위해 Python에서 제공하는 Counter 라이브러리를 이용했습니다.
Counter 라이브러리는 list에 저장된 원소들을
등장 횟수와 함께 저장해주는 기능을 합니다.
예를 들어, 1 2 2 3 6 8 8 이라면
(1, 1), (2, 2), (3, 1), (6, 1), (8, 2) 이렇게 저장됩니다.
이때 most_common() 함수는 등장 횟수가 가장 큰 원소부터 정렬해주는 역할을 합니다.
만약 등장 횟수가 같다면 원소를 오름차순으로 정렬합니다.
즉, (2, 2), (8, 2), (1, 1), (3, 1), (6, 1) 이렇게 저장됩니다.
문제에서 만약 최빈값이 여러 개일 경우 두 번째로 작은 값을 출력하라 했으므로
Counter 라이브러리를 이용한 결과가 1개 이상이라면
첫 번째와 두 번째 원소의 첫번째 값 = 최빈값을 비교하여 그 값이 같다면
두 번째 원소의 0번째 값을 출력하도록 해주고
그렇지 않다면 첫 번째 원소의 0번째 값을 출력하도록 해주었습니다.
그 외의 경우에는 무조건 첫 번째 원소의 0번째 값이 출력되도록 해주었습니다.
4. 범위
최댓값과 최솟값의 차이를 구하는 것입니다.
위에서 중앙값을 구하기 위해 수들을 오름차순으로 정렬했었습니다.
따라서 list의 첫 번째 원소는 가장 작은 값,
마지막 원소는 가장 큰 값입니다.
따라서 마지막 원소에서 첫 번째 원소를 뺀 값을 출력해주면 됩니다.
My Code
from collections import Counter
import sys
input = sys.stdin.readline
n = int(input()) # 수의 개수
data = []
for _ in range(n):
data.append(int(input())) # 수들을 list에 삽입
# 산술 평균을 소수점 이하 첫째 자리에서 반올림하여 출력
print(round(sum(data) / n))
data.sort() # 오름차순으로 정렬
print(data[(n - 1) // 2]) # 중앙값의 index를 구해 출력
# 수를 등장 횟수와 함께 저장한 뒤 등장 횟수가 가장 큰 순서로 저장
# 등장 횟수가 같다면 원소를 오름차순으로 정렬
new = Counter(data).most_common()
if len(new) > 1: # 결과가 하나 이상이라면
if new[0][1] == new[1][1]: # 첫 번째와 두 번째 비교했을 때 같으면
print(new[1][0]) # 두 번째로 작은 값 출력
else: # 그렇지 않다면
print(new[0][0]) # 등장횟수가 가장 큰 원소 출력
else: # 결과가 하나라면 첫 번째 값 출력
print(new[0][0])
# 오름차순으로 정렬된 상태이므로 마지막-첫 번째 값 출력
print(data[-1] - data[0])
'백준(Python) 풀이' 카테고리의 다른 글
백준 1003번. 피보나치 함수 (Python / 파이썬) (0) | 2022.04.20 |
---|---|
백준 1932번. 정수 삼각형 (Python / 파이썬) (0) | 2022.04.20 |
백준 1475번. 방 번호 (Python / 파이썬) (0) | 2022.04.19 |
백준 11866번. 요세푸스 문제 0 (Python / 파이썬) (0) | 2022.04.19 |
백준 1931번. 회의실 배정 (Python / 파이썬) (0) | 2022.04.19 |
댓글