hi jaeneee

baekjoon(2108-통계학)_python 본문

알고리즘/baekjoon

baekjoon(2108-통계학)_python

ash silver 2022. 5. 26. 16:42

1) 문제

 

 

2) 예시

3) 제출

import math
import sys

input = sys.stdin.readline
n = int(input())
num = [int(input()) for _ in range(n)]
num.sort()

def mode(n, num):
    cnt = list(range(1, n+1))
    cnt = [[] for k in range(0, n+1)]

    count = 1
    maximum = 1

    for k in range(1, n):
        if num[k] == num[k-1]:
            count += 1
        else: 
            cnt[count].append(num[k-1])
            maximum = max(count, maximum)
            count = 1
        if k == n-1:
            cnt[count].append(num[k])
            maximum = max(count, maximum)
    if n == 1:
        cnt[1].append(num[0])
    cnt[maximum].sort()
    if len(cnt[maximum]) == 1:
        return str(cnt[maximum][0])
    else:
        return str(cnt[maximum][1])

# round(number)는 number의 소수점 첫 번째 자리에서 반올림
# round(number,2)는 number의 소수점 셋째 자리에서 반올림
mean = round(sum(num)/n)
# math.trunc(number)는 number의 정수 부분 반환
center = num[math.trunc(n/2)]

minus = num[n-1] - num[0]
print(mean)
print(center)
print(mode(n, num))
print(minus)

4) 메모리/시간/코드길이

5) PLUS

전에 한 번 시도했다가 못 풀겠기에 포기했는데 이번에는 꼭 끝장내겠다는 생각으로 도전했다. 

1시간 30분 정도 걸렸다,,ㅋㅋ

평균과 중앙값이랑 범위만으로 보면 브론즈 문제랑 다를 바 없지만 최빈값에서 시간을 꽤 쓰게 된다.

이 문제는 최빈값 구하는 것이 관건인 듯하다. 

사실 이번에 

이런 식으로 최빈값에 대해 한참 동안 고민하다가 너무 시간도 오래 걸리고 노가다 같아서 다른 사람 답지를 봤다.

하지만 코드만 보고도 쉽게 이해가 되지 않았고, 코드를 바탕으로 예시를 하나씩 넣어보며 이해를 해봤다.

<문제 해결 방법>

설명 생략 -> 평균값 구하기, 중앙값 구하기, 범위 구하기

mode 함수만 설명하도록 하겠다.

- 변수 설명 - 

cnt[] = 몇 번 나왔는지 넣을 리스트

cnt[][] = 카운트 별로 나온 값 넣기

ex)

1)

num[] = [1, 2, 3, 4, 5] -> 1,2,3,4,5가 각 한 번

cnt[1] = [1, 2, 3, 4, 5]

2)

num[] = [1, 1, 1, 2, 2, 3] -> 1이 세 번, 2가 두 번, 3이 한 번

cnt[1] = [3]

cnt[2] = [2]

cnt[3] = [1]

cnt[나온 횟수] = 나온 횟수가 (나온 횟수)인 수

 

count = 나온 횟수를 임시 저장할 변수

maximum = 최빈값이 나온 횟수를 저장할 변수

 

맞힌 사람 등수를 보니 1등부터 11등까지는 전부 PyPy3으로 풀었다.

 

 

Comments