-
[BOJ] 2108번: 통계학Algorithm/Baekjoon Online Judge 2022. 3. 26. 01:45728x90
https://www.acmicpc.net/problem/2108
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
이후 최빈값에서 살짝 고민을 했는데 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'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글
[BOJ] 9663번: N-Queen (0) 2022.04.01 [BOJ] 15649번: N과 M(1) (0) 2022.03.31 [BOJ] 10989번: 수 정렬하기 3 (0) 2022.03.26 [BOJ] 2751번: 수 정렬하기 2 (0) 2022.03.26 [BOJ] 2750번: 수 정렬하기 (0) 2022.03.23