[BaekJoon] 2108번: 통계학 by python
https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
code
from collections import Counter
import sys
numbers = []
for _ in range(int(sys.stdin.readline())):
num = int(sys.stdin.readline())
numbers.append(num)
numbers.sort()
most_num = Counter(numbers).most_common(2) #numbers에서 최빈깂 2개를 반환
print(round(sum(numbers)/len(numbers))) #산술평균 값 출력
print(numbers[len(numbers)//2]) #중앙 값 출력
if len(numbers)>1:
if most_num[0][1] == most_num[1][1]: #첫번째와 두번째 빈도가 같다면
print(most_num[1][0]) #두번째 최빈값 출력
else:
print(most_num[0][0]) #최빈값 하나일때 최대 최빈값 출력
else:
print(most_num[0][0])
print(max(numbers)-min(numbers)) #최대값-최소값
1st error
이번 문제를 풀며 나에게 애로 사항은 최빈값 구하기였다.
최빈값을 구하기 위하여
collections 모듈의 most_common() 함수를 사용하여 해결 하였다.
collections 모듈을 이해하기 위해
https://infinitt.tistory.com/183
파이썬(Python) Collections 모듈 - counter , most_common
collections 모듈은 기본적으로 파이썬에 내장되어있는 내장함수입니다. (따로 설치가 필요 없..) 리스트나, 문자열의 요소에 대한 개수를 구할때 반복문으로도 구할 수 있지만, counter 함수를 사용
infinitt.tistory.com
님의 블로그를 참고하였다.
collections모듈의 most_common() 함수는
Counter(list변수).most_common(number)
를 입력하여 list 변수내의 최빈값을 입력한 number만큼 반환 해준다.
반환시에는
>>[(최빈값,리스트내 최빈값 개수).....]
형태로 반환된다.
이것을 이용하여 2108번 출력조건인
[출력 - 셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.]
를 만족하기 위해 2차원리스트 형태로 접근하여 비교하면 된다.
해당 코드
most_num = Counter(numbers).most_common(2)
if len(numbers)>1:
if most_num[0][1] == most_num[1][1]: #첫번째와 두번째 빈도가 같다면
print(most_num[1][0]) #두번째 최빈값 출력
else:
print(most_num[0][0]) #최빈값 하나일때 최대 최빈값 출력
else:
print(most_num[0][0])
2st error
두번째 애로사항은 시간초과였다.
처음 작성한 코드는
int(input())
를 사용하여 입력을 받았는데
해당 입력은 반복문을 여러줄을 입력받는다면 시간초과가 뜬다.
아래와같이 sys.stdin.readline()을 이용하여 구현하였다.
import sys
int(sys.stdin.readline())
해당 입력의 대한 정보는 아래 블로그에 있다.
[Python 문법] 파이썬 입력 받기(sys.stdin.readline)
파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.
velog.io
review
처음에 이 문제를 읽었을때는 실버3문제치고 생각보다 쉽다고 생각하였지만,
최빈값을 구하는 과정에서 Collections모듈의 most_common함수를 처음 사용하면서 공부할 사항이 있었다.
아직 모듈들이 익숙치 않지만 차차 더 공부해 나가야겠다.