문제
어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 예를 들어 10, 40, 30, 60, 30, 20, 60, 30, 40, 50의 평균은 (10 + 40 + 30 + 60 + 30 + 20 + 60 + 30 + 40 + 50) / 10 = 370 / 10 = 37이 된다.
평균 이외의 또 다른 대표값으로 최빈값이라는 것이 있다. 최빈값은 주어진 수들 가운데 가장 많이 나타나는 수이다. 예를 들어 10, 40, 30, 60, 30, 20, 60, 30, 40, 50이 주어질 경우, 30이 세 번, 40과 60이 각각 두 번, 10, 20, 50이 각각 한 번씩 나오므로, 최빈값은 30이 된다.
열 개의 자연수가 주어질 때 이들의 평균과 최빈값을 구하는 프로그램을 작성하시오.
입력
첫째 줄부터 열 번째 줄까지 한 줄에 하나씩 자연수가 주어진다. 주어지는 자연수는 1,000 보다 작은 10의 배수이다.
출력
첫째 줄에는 평균을 출력하고, 둘째 줄에는 최빈값을 출력한다. 최빈값이 둘 이상일 경우 그 중 하나만 출력한다. 평균과 최빈값은 모두 자연수이다.
예제 입력10
40 30 60 30 20 60 30 40 50 |
예제 출력37
30 |
풀이
평균과 최빈값을 구하는 문제이다.
최빈값의 경우 max 함수의 key 파라미터를 이용하여 구할 수 있다.
arr = [int(input()) for _ in range(10)]
print(sum(arr)//10)
print(max(arr, key=arr.count))
단, 위의 방법은 시간복잡도가 N^2에 해당하므로 이 문제처럼 입력 원소가 매우 작을 때에만 사용이 가능하다.
원소가 1만개만 되어도 약 1억번의 연산이 필요하여 1초 정도의 시간이 소요된다.
만약 원소가 10만개와 같이 매우 많을 때면, 아래 방법처럼 딕셔너리를 이용하는 방법이 있겠다.
import sys
input = sys.stdin.readline
mean = 0
d = dict()
for _ in range(10):
n = int(input())
mean += n
if d.get(n):
d[n] += 1
else:
d[n] = 1
print(mean//10)
print(sorted(list(zip(d.values(),d.keys())))[-1][1])
'알고리즘 연습 > 구현, 문자열' 카테고리의 다른 글
[🥉2 / 백준 2789 / 파이썬] 유학 금지 (0) | 2022.02.08 |
---|---|
[🥉2 / 백준 2711 / 파이썬] 오타맨 고창영 (0) | 2022.02.05 |
[🥉2 / 백준 1919 / 파이썬] 애너그램 만들기 (0) | 2022.01.21 |
[🥉3 / 백준 3047 / 파이썬] ABC (0) | 2022.01.15 |
[🥉2 / 백준 2744 / 파이썬] 대소문자 바꾸기 (0) | 2022.01.13 |