[BOJ/백준-Python]2108번 - 통계학

2108번 - 통계학

문제

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

산술평균 : N개의 수들의 합을 N으로 나눈 값 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값 최빈값 : N개의 수들 중 가장 많이 나타나는 값 범위 : N개의 수들 중 최댓값과 최솟값의 차이 N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

둘째 줄에는 중앙값을 출력한다.

셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.

넷째 줄에는 범위를 출력한다.

예제 입력 1

5
1
3
8
-2
2

예제 출력 1

2
2
1
10

예제 입력 2

1
4000

예제 출력 2

4000
4000
4000
0

예제 입력 3

5
-1
-2
-3
-1
-2

예제 출력 3

-2
-2
-1
2

예제 입력 4

3
0
0
-1

예제 출력 4

0
0
0
1

(0 + 0 + (-1)) / 3 = -0.333333… 이고 이를 첫째 자리에서 반올림하면 0이다. -0으로 출력하면 안된다.


해결할 방법을 생각해보자.💡

파이썬으로 통계의 기본적인 평균, 중앙값, 최빈값, 범위를 구하는 문제다.

일반적으로 사용하는 input이 아닌 sys.stdin.readline()을 사용하기 위해서 sys라이브러리를 호출해준다.

import sys

숫자의 개수 N개를 받아주자.

N = int(sys.stdin.readline())

이제 숫자들을 받아줄 리스트를 하나 생성해주자.

nums = []

숫자의 개수 N개 만큼 반복문을 사용해서 숫자들을 nums로 넘겨주자.

for i in range(N):
  n = int(sys.stdin.readline())
  nums.append(n)

nums에 받아준 숫자들을 정렬해주자.

nums.sort()

이제 출력해야하는 4가지를 하나씩 생각해보자.

  1. 평균이다. 평균은 숫자들을 모두 더한 후 그 숫자의 개수만큼 나눠주면된다. 문제에서는 소수점 첫짜리에서 반올림하라고 했으므로 round를 사용해서 반올림해주면 된다.

    print(round(sum(nums)/len(nums)))
    
  2. 중앙값은 숫자를 정렬한 뒤에 가운데에 있는 값을 의미한다. nums는 이미 정렬이 되어있고, N은 홀수이다. 따라서, N을 2로 나눠준 몫으로 인덱싱해주면 중앙값을 구할 수 있다. 왜냐하면 인덱스는 0부터 시작하기 때문이다.

    print(nums[len(nums)//2])
    
    1. 최빈값 문제는 Counter 함수를 사용해줘야한다. 이 함수는 리스트안에 있는 요소들의 빈도를 계산해서 딕셔너리 형태로 반환해준다. 그리고 most_common()을 사용해서 빈도가 높은것 순서대로 정렬할 수 있다. 문제에서는 만약 최빈값이 두개일 때 두번째 최빈값을 반환하라고 했으므로, 다음과 같이 코드를 작성해주면 되겠다. 어차피 최빈값이 2개 이상이라해도, 두 번째꺼를 반환해야 한다는 점을 생각해야한다.

      # 만약 요소가 2개 이상이고, 가장 빈도가 많은 값이 두개가 존재한다면(첫번째, 두번째) 두 번째 요소를 반환
      if len(counter) > 1 and counter[0][1] == counter[1][1]:
        print(counter[1][0])
      # 아니라면 빈도가 가장 많은 값 하나를 반환
      else:
        print(counter[0][0])
      
    2. 범위는 가장 큰 값에서 가장 작은 값을 차감해주면 된다. maxmin을 사용하면 쉽게 해결할 수 있다.

      print(max(nums)-min(nums))
      

코드 💻

코드💻

import sys
from collections import Counter

N = int(sys.stdin.readline())

nums = []

for i in range(N):
  n = int(sys.stdin.readline())
  nums.append(n)

nums.sort()
print(round(sum(nums)/len(nums)))
print(nums[len(nums)//2])
counter = Counter(nums).most_common()
if len(counter) > 1 and counter[0][1] == counter[1][1]:
  print(counter[1][0])
else:
  print(counter[0][0])
print(max(nums)-min(nums))

해결 로그

문제 푼 날짜 체크
2022-07-02
   
   
   
   

2022

[web]jQuery 복습 3

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 2

13 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 1

14 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리4

5 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리3

10 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리2

7 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리1

8 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]CSS 기초 정리

11 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]HTML 기초 정리

8 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[Pandas]pandas 연습

3 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑

2021

[Python기초]module

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑