출처 : 백준, https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
와 문제 더럽다
풀이
from collections import Counter
import sys
if __name__ == '__main__':
arr = [int(sys.stdin.readline()) for _ in range(int(input()))]
arr.sort()
L = len(arr)
avg = int(round(sum(arr) / len(arr), 0))
middle = arr[L//2]
range = arr[L-1] - arr[0]
arr = Counter(arr)
print(avg)
print(middle)
most = arr.most_common()
if len(most) > 1:
if most[0][1] != most[1][1]:
print(most[0][0])
else:
print(most[1][0])
else:
print(most[0][0])
print(range)
최빈값에서 막혔는데 함수가 있더라.
아................
시간 복잡도
-
알게 된 점
Counter 모듈의 most_common 함수
from collections import Counter
test = Counter([1, 2, 2, 3, 3, 4, 4, 4, 4])
print(test.most_common())
#output : [(4, 4), (3, 3), (3, 2), (1, 1)]
개수를 세는 라이브러리인 Counter에는 빈도수를 세주는 most_common이라는 함수가 내장되어있다.
Counter에서 이 함수를 사용하면 빈도가 높은 것부터 (원본, 개수)의 형태로 리스트를 반환하여 준다.
sys.stdin.readline()
import sys
sys.stdin.readline()
겨우겨우 풀었는데 시간초과가 나길래 입력 함수를 바꾸어 보았더니 시간 제한에 통과하였다.
sys 모듈의 sys.stdin.readline()함수는 i/o 시간이 오래 걸려 시간 제한에 걸릴 경우 input() 대용으로 사용할 수 있다.
PyPy3
from collections import Counter
if __name__ == '__main__':
arr = [int(input()) for _ in range(int(input()))]
arr.sort()
L = len(arr)
avg = int(round(sum(arr) / len(arr), 0))
middle = arr[L//2]
range = arr[L-1] - arr[0]
arr = Counter(arr)
print(avg)
print(middle)
most = arr.most_common()
if len(most) > 1:
if most[0][1] != most[1][1]:
print(most[0][0])
else:
print(most[1][0])
else:
print(most[0][0])
print(range)
PyPy3 언어로 선택할 경우 그냥 input() 함수를 사용해도 시간 초과가 나지 않는다.
Python round 함수의 오사오입 규칙
python의 내장 반올림 함수 round는 오사오입 방식을 취한다.
우리가 흔히 아는 5면 올리고 5보다 작으면 내리는 방식은 사사오입 방식인데,
파이썬은 이와 달리 5일 경우, 앞이 홀수면 올리고 짝수면 내리는 방식을 사용한다.
print(round(4.5)) # 4
print(round(5.5)) # 6
예를 들어 위 코드를 보면 4.5를 반올림할 경우 사사오입 방식에서는 5이지만,
오사오입 방식에서는 앞자리가 짝수이므로 4가 출력된다.
5.5는 앞자리가 홀수이므로 6이 출력되고 이는 사사오입 방식과 같다.
파이썬에서 사사오입 반올림을 구현하기 위한 몇 가지 방법이 있는데, (출처 : 푸르고 개발 블로그)
1. 결과값에 0.5를 더해주고 내림. (음수의 경우에는 0.5를 빼주고 내림)
test = 4.5
if test >= 0:
print(int(test + 0.5)) #5
else:
print(int(test - 0.5))
2. 미세한 값을 더해주고 round 사용
test = 4.5
print(round(test + 0.00000000002)) #5
3. 직접 구현
temp = 4.5
if abs(temp - int(temp)) < 0.5:
print(int(temp))
else:
if temp > 0:
print(int(temp) + 1) #5
else:
print(int(temp) - 1)
하는 방식을 사용하여 구현할 수 있다.
고찰
-
'알고리즘 > Python' 카테고리의 다른 글
[python] 백준 10158 - 개미 (0) | 2022.03.12 |
---|---|
[python] 백준 2693 - N번째 큰 수 (0) | 2022.03.11 |
[python] 백준 2609 - 최대공약수와 최소공배수 (0) | 2022.03.09 |
[python] 프로그래머스 - 전력망 둘로 나누기 (0) | 2022.03.09 |
[python] 백준 2309 - 일곱 난쟁이 (0) | 2022.03.08 |