본문 바로가기

코딩테스트/백준

[Python] 백준 2108번. 통계학

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

 

2108번: 통계학

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

www.acmicpc.net

 

문제설명

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

 

풀이설계

  1.  산술형은 sum / 반올림은 round
  2. 중앙값은 배열의 중앙값 // 2
  3. 최빈값
    1. 배열의 길이가 1 이하인 경우 0번째 값 출력
    2. 배열의 길이가 1 초과인 경우 Counter 최빈값을 계산한뒤 역순으로 정렬해서 
      1. 첫번째값과 0번째 value 값을 비교해서 값이 같다면 첫번째 값을 출력
      2. 그렇지않다면 0번째 값을 출력한다.
  4. 범위 0번째와 가장 끝에 있는 값의 차이를 계산

 

import sys
from collections import Counter

input=sys.stdin.readline

n = int(input())
nums = [int(input()) for _ in range(n)]
nums.sort()

print(round(sum(nums) / n))  # 산술평
print(nums[(len(nums)) // 2])

if len(nums) <= 1:
    print(nums[0])
else:
    cnts = sorted(Counter(nums).items(), key=lambda x: x[1], reverse=True)
    if cnts[0][1] == cnts[1][1]:
        print(cnts[1][0])
    else:
        print(cnts[0][0])

print(nums[n-1] - nums[0])