[코딩테스트/백준/Python]통계학

Enter·2022년 8월 28일
0

코딩테스트

목록 보기
50/68

🔍통계학

<문제>

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

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
  4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이
    N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

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


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

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

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

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



💡생각

  • 라이브러리 없이 풀어본 풀이.
  1. 산술평균은 배열의 합계를 N의 숫자만큼 나눈다.
  2. 중앙값은 배열을 정렬해 가운데 숫자를 출력한다
  3. 최빈값은 숫자들이 나온 개수를 센 배열을 만들어 그 중 제일 빈도 수가 많은 수를 출력한다.
  4. 범위는 배열을 정렬해 가장 큰 숫자-가장작은 숫자를 한다.



❓잘못된 코드1

시간초과

문제점1. 시간초과

import sys
N = int(sys.stdin.readline())

def main(N):
    medi = []
    for i in range(0, N):
        medi.append(int(sys.stdin.readline()))

    medi.sort()
    print(round(sum(medi)/N))
    print(medi[N//2])

    medi_set = list(set(medi))
    medi_list = [0,] *len(medi_set)
    for i in range(0, len(medi_list)):
        medi_list[i] = medi.count(medi_set[i])
    for i in range(0, len(medi_list)):
        if medi_list[i] != max(medi_list):
            del(medi_set[i])
    if len(medi_set) == 1:
        print(medi_set[0])
    else:
        print(medi_set[1])

    print(medi[N-1]-medi[0])
    
main(N)



⏬다른사람의 코드


🔗풀이 참고
https://velog.io/@taeheon95/%EB%B0%B1%EC%A4%80-2108-%ED%86%B5%EA%B3%84%ED%95%99-Python%ED%8C%8C%EC%9D%B4%EC%8D%AC

import sys

ndict = {i:0 for i in range(-4000,4001)}
# n 의 갯수
numOfN = int(sys.stdin.readline().rstrip())

# 사전 자료구조를 만들어서 개수를 구함
for i in range(numOfN):
    inp = int(sys.stdin.readline().rstrip())
    ndict[inp] += 1

nlist = []
# 카운팅 정렬으로 값을 넣어줌
for [key, value] in ndict.items():
    for _ in range(value):
        nlist.append(key)

# 최빈 값을 구하기 위한 리스트
orderByCommon = sorted(ndict.items(), key=lambda item:item[1], reverse=True)

# 산술 평균
print(round(sum(nlist)/numOfN))
# 중앙 값
print(nlist[numOfN//2])
# 최빈 값
if len(orderByCommon) > 1:
    if orderByCommon[0][1] == orderByCommon[1][1]:
        print(orderByCommon[1][0])
    else: print(orderByCommon[0][0])
else:
    print(orderByCommon[0][0])
# 범위
print(nlist[-1]-nlist[0])







🔗백준 - 통계학
https://www.acmicpc.net/problem/2108

profile
Cherish the moment :)

0개의 댓글