알고리즘/백준[baekjoon]

[BaekJoon] 2108번: 통계학 by python

코딩하는이씨 2022. 2. 28. 22:17
728x90
반응형

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())

 

해당 입력의 대한 정보는 아래 블로그에 있다.

https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

 

[Python 문법] 파이썬 입력 받기(sys.stdin.readline)

파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.

velog.io

 

review

처음에 이 문제를 읽었을때는 실버3문제치고 생각보다 쉽다고 생각하였지만,

최빈값을 구하는 과정에서 Collections모듈의 most_common함수를 처음 사용하면서 공부할 사항이 있었다.

아직 모듈들이 익숙치 않지만 차차 더 공부해 나가야겠다.

728x90
반응형