어느 고등학교에서 실시한 1000명의 수학 성적을 토대로 통계 자료를 만들려고 한다.
이때, 이 학교에서는 최빈수를 이용하여 학생들의 평균 수준을 짐작하는데, 여기서 최빈수는 특정 자료에서 가장 여러 번 나타나는 값을 의미한다.
다음과 같은 수 분포가 있으면,
10, 8, 7, 2, 2, 4, 8, 8, 8, 9, 5, 5, 3
최빈수는 8이 된다.
최빈수를 출력하는 프로그램을 작성하여라 (단, 최빈수가 여러 개 일 때에는 가장 큰 점수를 출력하라).
[제약 사항]
학생의 수는 1000명이며, 각 학생의 점수는 0점 이상 100점 이하의 값이다.
[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 줄에는 테스트 케이스의 번호가 주어지고 그 다음 줄부터는 점수가 주어진다.
[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스에 대한 답을 출력한다.
for i in range(1, int(input()) + 1):
_ = input() # 테스트케이스 번호
grades = list(map(int, input().split())) #점수
freq = [0] * 101 #0~100점까지의 빈도를 구하기 위함
mode = 0 #최빈값
for grade in grades:
freq[grade] += 1 #현재점수의 빈도상승
if freq[grade] >= freq[mode]: mode = grade #현재점수 빈도가가 최빈값 이상이면 최빈수 변경
print(f"#{i} {mode}")
예전에 백준의 통계학이란 문제를 풀면서 최빈값 구하는 알고리즘을 익혔다보니 어렵지않게 풀 수 있었다.
파이썬 유저답게 빈도를 구하기 위해 Counter
를 사용하고 최빈수를 구하기 위해 max
를 사용할 수 있겠으나 그러면 공간복잡도와 시간복잡도 둘다 늘어날 것 같아서, 그런 거 없이 풀었다.
실제로 다른 파이썬 유저들에 비해 메모리와 실행시간 모두 낮다(코드 수는 길지만ㅋ)