티스토리 뷰

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

 

2108번: 통계학

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

www.acmicpc.net


1. 문제 내용

 

 

2. 접근 방식

  • 입력되는 정수의 개수가 최대 50만이므로, 최대한 입력 받은 정수 리스트 순회를 줄이자.

이에, 정수를 입력받을 때 산술평균을 위한 sum 계산과 최빈값을 위한 각 수의 카운팅을 수행한다.

 

  • 입력 받은 정수 리스트를 정렬하는 것은 불가피하므로, 인덱싱을 활용하자.

중앙값을 구하려면 리스트를 오름차순 정렬해야 한다. 그리고 이를 중앙값 뿐만 아니라, 범위를 구할 때도 활용하자. min( )과 max( ) 내장 함수를 사용할 수도 있지만, 이미 리스트는 오름차순 정렬돼 있으므로 0번째가 최소값, -1번째가 최대값이다. 인덱싱은 O(1) 시간 복잡도를 가지므로, 내장함수 대신 인덱싱으로 범위를 구하자.

 

 

3. 정답 코드

import sys

input = sys.stdin.readline

n = int(input())
data = []

_sum = 0
count = dict()
for _ in range(n):
    x = int(input())
    data.append(x)

    _sum += x

    if x not in count:
        count[x] = 1
    else:
        count[x] += 1

data.sort()

# 산술평균
print(round(_sum/n))

# 중앙값
print(data[n//2])

# 최빈값
freq = max(count.values())
numbers = []
for key, value in count.items():
    if value == freq:
        numbers.append(key)

if len(numbers) == 1:
    print(numbers[0])
else:
    print(sorted(numbers)[1])

# 범위
print(data[-1] - data[0])
728x90