Algorithm/BaekJoon

백준 22.01.26. 2108번 - 통계학

HappyFrog 2022. 1. 26. 21:51

↓ 틀린코드

더보기
from multiprocessing import Array


def mergeSort(array):
    if len(array) < 2:
        return array

    middle = len(array) // 2
    arr1 = mergeSort(array[:middle])
    arr2 = mergeSort(array[middle:])

    mergedList = []
    i = j = 0
    while i < len(arr1) and j < len(arr2):
        if arr1[i] < arr2[j]:
            mergedList.append(arr1[i])
            i += 1
        else:
            mergedList.append(arr2[j])
            j += 1

    mergedList += arr1[i:]
    mergedList += arr2[j:]

    return mergedList


def findMode(array):
    searchVal = set(array)
    rec = {}
    for i in searchVal:
        if array.count(i) not in rec.keys():
            rec[array.count(i)] = [i]
        else:
            rec[array.count(i)] = rec[array.count(i)] + [i]

    result = list(rec[max(rec.keys())])
    result = mergeSort(result)
    if len(result) < 2:
        return result[0]
    return result[1]


N = int(input())

arr = []

for i in range(N):
    arr.append(int(input()))

arr = mergeSort(arr)

print(round(sum(arr)/len(arr)))
print(arr[len(arr)//2])
print(findMode(arr))
print(max(arr) - min(arr))

익혔던 합병정렬을 이용하여 시도해봤지만 시간초과가 나왔습니다

import sys
from collections import Counter

arr = []
for _ in range(int(sys.stdin.readline())):
    arr.append(int(sys.stdin.readline()))

arr.sort()

cnt = Counter(arr).most_common(2)


print(round(sum(arr) / len(arr)))
print(arr[len(arr) // 2])

if len(arr) > 1:
    if cnt[0][1] == cnt[1][1]:
        sys.stdout.write(str(cnt[1][0]) + "\n")
    else:
        sys.stdout.write(str(cnt[0][0]) + "\n")
else:
    sys.stdout.write(str(cnt[0][0]) + "\n")
sys.stdout.write(str(max(arr) - min(arr)))
  • 주어진 arr을 정렬해줍니다.
    1. 평균값을 위하여 round메서드를 사용했습니다.
      • round메서드는 반올림을 해주는 메서드입니다. 두번째 매개변수가 없다면 정수로 반환해주지만 두번째 매개변수를 할당한다면 할당된 수 만큼의 소숫점까지 반환합니다.
    2. 정렬된 메서드에서 중간값을 구하기 위해 소숫점 이하를 버리는 "//"연산자를 사용하여 인덱스로 사용했습니다.
    3. Counter클래스의  most_common메서드는 최빈수부터 내림차순으로 정리해주는 역할을 합니다.
      • 매개변수로 주어진 수 만큼 내림차순으로 최빈수를 반환합니다.
      • Counter클래스로 정리해둔 값을 활용하여 최빈수 또는 두번째로 작은 최빈수를 출력합니다.
      • 위 사진에서 볼 수 있듯이 최빈수순으로 정리되며 작은 값부터 정리됩니다.
      • cnt[n][1]은 빈도를 나타냅니다.
      • 첫번째와 두번째의 빈도가 같다면 두번째를 출력해줍니다.
      • 그렇지 않다면 첫번째를 출력해줍니다.
      • 또는 주어진 수의 배열길이가 1일때를 대비하여 또 다른 분기를 생성하여 cnt의 처음 값을 출력하도록 해줍니다.
    4. 범위는 배열내의 최댓값과 최솟값을 구하여 그 차이를 출력했습니다.