View

[Python] Baekjoon 백준 2108번 통계학

 

문제

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

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

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

입력

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

출력

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

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

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

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

 

 

import sys
import collections

n = int(input())

num = [int(sys.stdin.readline()) for _ in range(n)]

print(round(sum(num) / n))

num.sort()
print(num[len(num) // 2])

cnt = collections.Counter(num)
cnt1 = cnt.most_common(2)
if n == 1:
    print(num[0])
elif cnt1[0][1] == cnt1[1][1]:
    print(cnt1[1][0])
else:
    print(cnt1[0][0])

if n == 1:
    print(0)
else:
    if num[0] < 0:
        if num[-1] < 0:
            print(abs(num[0]) - abs(num[-1]))
        else:
            print(abs(num[0]) + abs(num[-1]))
    else:
        print(abs(num[-1]) - abs(num[0]))

 

print(round(sum(num) / n))

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

round() 로 반올림

 

num.sort()
print(num[len(num) // 2])

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

sort() 로 오름차순 정렬

리스트의 길이를 2로 나눠서 리스트의 중간값 출력

n // 2 도 가능

 

cnt = collections.Counter(num)
cnt1 = cnt.most_common(2)
if n == 1:
    print(num[0])
elif cnt1[0][1] == cnt1[1][1]:
    print(cnt1[1][0])
else:
    print(cnt1[0][0])

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

*주의 : 문제에 "여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다" 라고 되어있다

collections.Counter() 로 겹치는 숫자 체크

most_common(2) 로 상위 2개를 뽑아냄

n 이 1이면 그냥 리스트 첫번째꺼 출력

상위 2개 의 카운팅 숫자가 동일하면 1번째 인덱스 값 출력(즉, 두번째로 작은 값)

그 외 에는 첫번째꺼 출력

 

여기서 n == 1 을 지우게 되고 만약 1개 입력값이 들어가면

두번째 if문에서 cnt1[1][1] 을 찾을수 없게되어 오류났다

 

if n == 1:
    print(0)
else:
    if num[0] < 0:
        if num[-1] < 0:
            print(abs(num[0]) - abs(num[-1]))
        else:
            print(abs(num[0]) + abs(num[-1]))
    else:
        print(abs(num[-1]) - abs(num[0]))

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

이건 최소 최대 값의 숫자가 음수인지 체크해야한다

최솟값이 음수인경우

음수x 부터 0 까지의 값을

최댓값이 음수라면 둘이 양수로 바꿔서 빼주고

최댓값이 양수라면 최솟값만 양수로 바구고 최댓값과 더해준다

그외에는 최솟값 최댓갓이 둘다 양수 이니

최댓값에서 최솟값만 빼주었다

 

728x90
반응형
Share Link
reply