본문 바로가기
프로그래밍/Python

[파이썬] 백준 2108번 통계학 문제 풀이 python

by 아임코딩 2024. 2. 5.
728x90
반응형

문제 설명

수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
  4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이

N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

 

문제 링크

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

입출력 예시

프로그램 코드

 

import sys  #입력을 위한 라이브러리 import

N = int(input())    #N 입력

dic = {}    #숫자 : 빈도수 저장 위한 딕셔너리
nums = []   #숫자들 저장 위한 리스트

for i in range(N):  #숫자 N개 입력
    num = int(sys.stdin.readline())
    nums.append(num)
    if num not in dic.keys():   #딕셔너리에 빈도수 저장
        dic[num] = 1
    else:
        dic[num] += 1

nums.sort() #중앙값 계산을 위한 리스트 정렬

avg = round((sum(nums) / len(nums)))    #평균 계산 round() 반올림


cen = nums[len(nums)//2] #중앙값 계산

mx = max(dic.values())  #최대 빈도수 숫자 구하기
numbers = []            #최대 빈도수 숫자 저장할 리스트

for key, value in dic.items():  #딕셔너리 조회
    if value == mx: #최대 빈도수면
        numbers.append(key) #리스트에 저장

if len(numbers) == 1:   #최대 빈도수가 1개일 때
    fre = numbers[0]
else:                   #최대 빈도숫자가 여러개 일 때
    numbers.sort()
    fre = numbers[1]

ran = max(nums) - min(nums) #범위

print(avg)
print(cen)
print(fre)
print(ran)

 

프로그램 코드 설명

구해야 하는 값은 총 4가지.

산술평균 : N개의 수들의 합을 N으로 나눈 값

중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값

최빈값 : N개의 수들 중 가장 많이 나타나는 값

범위 : N개의 수들 중 최댓값과 최솟값의 차이

 

산술평균 : 모든 값을 리스트에 저장 후 (모든 리스트 합 / 리스트 길이) 를 반올림 하면 된다.

중앙값 : 리스트 정렬 후 가운데 인덱스에 있는 값을 구하면 된다.

최빈값 : 딕셔너리에 숫자별 빈도수를 저장하고 최대 빈도수를 구한다. 최대 빈도수를 가진 숫자들을 찾는다. 그 숫자들이 1개라면 그 값을, 2개 이상이라면 두번째로 작은 숫자를 출력한다.

범위 : 리스트의 최대값에서 최소값을 빼주면 된다.

728x90
반응형