2108 통계학

Yohan Kim·2022년 6월 21일
0

문제

정수 배열이 주어졌을 때, 평균, 중앙값, 최빈값, 범위를 출력하는 문제이다.

link: 통계학

코드

import sys

n = int(sys.stdin.readline())
data = []

for i in range(n):
    data.append(int(sys.stdin.readline()))

data.sort()
total = 0
high = -4001
low =  4001

count = 0
max_count = 0

once = True
often_value = data[0]
prev = data[0]

for i in data:
    total += i
    if(i < low):
        low = i
    if(i > high):
        high = i
    if(i == prev):
        count += 1
    else:
        if(count > max_count):
            max_count = count
            once = True
            often_value = prev
        elif(count == max_count):
            if(once):
                once = False
                often_value = prev
        count = 1
        prev = i
# 44444 일경우  44445 일경우 count = 1
if(count > max_count):
    max_count = count
    often_value = prev
elif(count == max_count):
    if(once):
        often_value = prev
print(round(total/n))
print(data[(n-1)//2])
print(often_value)
print(high - low)

풀이

파이썬 안에 내장함수를 써도 되지만, 내장 함수는 O(n)이 걸리므로
한번 for문을 돌려서 모든 값을 알아내고 싶었습니다.

  1. 중앙값을 찾기위해 배열을 정렬한다.
  2. 배열을 돌면서, 최댓값, 최솟값, 최빈값을 갱신한다.

배열이 정렬된 상태이므로 [1, 1, 1, 2, 2, 3] 과 같은 상태이다.
배열을 돌면서 이전 값 (prev)와 비교하여 값이 달라지면, 최빈값을 갱신하는 식으로 코드를 짰다.

once라는 불변수를 둔 이유는 최빈값 출력시 두번째로 작은 값을 출력하는 것이므로, 해당 최빈값이 첫번째로 작은 값인지 아닌지를 나타내는 변수이다.

n일 때 n-1과 값을 비교하므로 마지막 항 처리를 위해 while이 끝난 후에도 코드가 더 돈다.

profile
안녕하세요 반가워요!

0개의 댓글