여니의 취준 준비/코딩테스트 (Python)

[2108] 통계학 in python

여니's 2022. 3. 4. 22:52

> 수학

> 구현

> 정렬

 

 

시간 초과가 나서

input() -> readline()으로 바꿈.

 

1. 산술평균

처음에는

아래와 같이 작성했다.

그러나 바로 직전에 풀었던 문제가 떠올랐다..

부동 소수점 문제가...

 

여기서도 어쩔 수 없이 소수가 나오기 마련이다. 

그리고 round 함수는 우리가 알고 있는 반올림과는

큰 차이가 있다.

 

예시를 들어보자.

1.5를 반올림하면 -> 2

2.5를 반올림하면 -> 3

위 같은 결과가 나와야한다.

 

하지만 round 함수를 쓰면

1.5는 -> 2

2.5도 -> 2

위 같은 결과가 나온다.

띠용(?!)

 

우리가 알고 있는 방식은 "사사오입 방식"이라고 한다.

즉 0.5, 0.6처럼 절반 이상일 땐 반올림을 진행하고

그 이외엔 버리게 되는 형식이다.

 

 

그러나 round 함수

"오사오입 방식"이다.

 

 

5 미만의 숫자는 내리고 , 5 초과의 숫자는 올린다.

5의 앞자리가 만약 짝수면 내리고, 홀수면 올린다. 

 

1.5인 경우에는 1이 홀수니까 올려서 2가 된다.

2.5인 경우에는 2가 홀수니까 내려서 2가 되는 것이다. 

 

아래 코드는 해결방법 ^0^

 

만약 주어진 수가 양수이면서 실수이면?

반올림을 하려면 그 값에 0.5를 더해주고 정수형으로 바꿔주면 된다.

왜냐하면 3.5를 반올림하면 4가 나와야하는데,

round를 쓰게 되면 4가 나온다.

이 경우엔 round를 써도 원하는 값이 나오긴 한다.

하지만 여기에 0.5를 더해줘도 최종값은 변함이 없어서

따로 나눠서 줄 필요는 없다.

 

마찬가지로

2.5를 반올림하면 3이 나와야 하는데,

round를 쓰게 되면 2가 나온다.

따라서 2.5에 0.5를 더해줘야 3이 나오게 된다.

 

 

음수인 경우는 0.5를 빼줘야한다.

-3.5를 반올림하게 되면 -4가 되어야한다.

3.5를 반올림하면 4고 여기에 음수부호만 붙여주면 반올림이 된다.

따라서

양수일때처럼 0.5를 더해주는 건 같으나

최종부호를 +에서 -로 바꿔주는 과정이 들어간다.

s = int(sum(array))
if s >= 0:
    print(int(s / n + 0.5))
else:
    print(int(s / n - 0.5))

 

round 사용시 주의해서 사용하자! 

print(round(sum(array) / n))

2. 중앙값

: 이미 데이터를 받아올 때 정렬했으니 따로 다시 정렬해줄 필요는 없다.

중앙값은 숫자개수 / 2 -> 인덱스의 값을 가져오면 된다.

 

 


3. 최빈값

: n개의 수들 중 가장 많이 나타나는 값을 구하는 방식이다.

나는 일단 temp라는 딕셔너리에다가 

해당 숫자들이 각각 몇개가 존재하는 지 저장했다.

temp[array 배열값] = array 배열값의 총 개수

 

그리고 answer이라는 배열에 최빈값을 저장한다.

만약 answer이라는 배열의 길이가 2 미만이면 answer[0] 출력

2 이상이면 answer[1]을 출력해주면 된다. 

 

 


4. 범위 - 최댓값과 최솟값의 차이 (절댓값 출력**)

 

import sys

n = int(sys.stdin.readline())
array = sorted([int(sys.stdin.readline()) for _ in range(n)])
# 1. 산술평균
s = int(sum(array))
if s >= 0:
    print(int(s / n + 0.5)) # int(3.3) -> 3 , 정수부분만 가져옴. 소수는 버린다.
else:
    print(int(s / n - 0.5))

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

# 3. 최빈값
temp = dict()
for i in array:
    if i in temp:
        temp[i] += 1
    else:
        temp[i] = 1
answer = []
cnt = 0
for key in temp:
    if cnt <= temp[key]:
        if cnt == temp[key]:
            answer.append(key)
            cnt = temp[key]
        else:
            cnt = temp[key]
            answer = [key]
if len(answer) < 2:
    print(answer[0])
else:
    print(answer[1])

# 4. 범위
print(abs(array[-1] - array[0]))