Algorithm/Baekjoon Online Judge

[BOJ] 2108번: 통계학

mirae.kwak 2022. 3. 26. 01:45
728x90

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개인지 그 이상인지에 따라 출력을 맞춰준다.

728x90