[BOJ] 2108번: 통계학
https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
Python3
import sys
from collections import Counter
N = int(input())
numbers = []
for _ in range(N):
numbers.append(int(sys.stdin.readline()))
numbers.sort()
print(round(sum(numbers)/N))
print(numbers[N//2])
nums = Counter(numbers).most_common()
if len(nums) > 1 and nums[0][1] == nums[1][1]:
print(nums[1][0])
else:
print(nums[0][0])
print(numbers[-1]-numbers[0])
시간제한이 2초여서 sys.stdin.readline()을 통해 입력을 받아 시간을 줄였다.
설명은 여기 : https://miraekwak.tistory.com/72
[BOJ] 2751번: 수 정렬하기 2
https://www.acmicpc.net/problem/2751 2751번: 수 정렬하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은..
miraekwak.tistory.com
이후 최빈값에서 살짝 고민을 했는데 collections 모듈의 counter함수를 알아냈다. most_common() 함수를 사용할 경우 최빈값을 쉽게 구할 수 있다. 이 함수는 튜플 배열의 형태로 [(수, 개수).....] 반환한다. 최빈값부터 나열하게 되고 최빈값이 같다면 오름차순으로 나열한다. 그러면 우리는 처음 두개의 튜플만 확인하면 된다.
만약 두개 튜플의 개수가 같다면 문제에 제시된 대로 두번째로 작은 값을 출력해야하고 이외의 경우에는 첫 튜플의 수를 출력하면 된다.
만약 해당 모듈을 사용하지 않는다면 다음과 같이 풀이가 가능하다.
num = list(set(numbers))
maxNums = []
max_count = 0
for i in num:
if max_count < numbers.count(i):
maxNums = []
maxNums.append(i)
max_count = numbers.count(i)
elif max_count == numbers.count(i):
maxNums.append(i)
if len(maxNums) > 1:
maxNums.sort()
print(maxNums[1])
else:
print(maxNums[0])
maxNums는 최빈값을 가지는 수들을 저장하는 배열, max_count는 최빈값의 개수를 나타낸다. 중복을 없애고 입력받은 수들을 하나씩 볼 때 저장된 최빈값 개수보다 현재 수의 개수가 더 많다면 maxNums를 초기화한 후 해당 수를 삽입하고 최빈값 개수 역시 바꿔준다. 만약 개수가 똑같다면 배열에 최빈값을 넣어준다.
maxNums안에 최빈값이 1개인지 그 이상인지에 따라 출력을 맞춰준다.