파이썬 대표값(백준 BOJ 2592)


문제

어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 예를 들어 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의 배수이다.


출력

첫째 줄에는 평균을 출력하고, 둘째 줄에는 최빈값을 출력한다. 최빈값이 둘 이상일 경우 그 중 하나만 출력한다. 평균과 최빈값은 모두 자연수이다.

예제 입력 1 복사

10
40
30
60
30
20
60
30
40
50

예제 출력 1 복사

37
30


📝 풀어보기

📌 리스트 하나와 딕셔너리 하나를 생성한다. 10번의 입력동안 리스트 a에 입력값을 집어넣는다.

a = []
a_dict = {}

for _ in range(10):
    N = int(input())
    a.append(N)
    


📌 리스트 a 내의 요소를 돌면서 입력값이 딕셔너리 안에 없으면 키와 값 1을 추가하고 있다면 키와 값 1만큼을 증가시킨다

for i in a: 
    if i not in a_dict: # 입력값이 딕셔너리 안에 없으면 
        a_dict[i] = 1 # 카운트 1
    else:
        a_dict[i] += 1 # 카운트 1 증가


📌 a의 총합을 10으로 나눈 뒤 int 형변환을 하여 평균값을 구해낸다.

최빈값은 zip 함수로 값과 키를 엮어 튜플로 반환받은 후 리스트로 감싸고 정렬을 해서 맨 마지막 값의 1번째 요소를 가져온다. 주석으로 추가 설명을 하겠다.

ave_result = int(sum(a) / 10)

print(ave_result)
print(sorted(list(zip(a_dict.values(), a_dict.keys())))[-1][1])


# zip은 순회 가능한 객체를 인자로 받고
# 각 객체가 담고있는 원소를 튜플의 형태로 차례로 접근할 수 있는 반복자를 반환
# 여기서는 a_dict.values()와 a_dict.keys()를 엮어 
# 10, 1
# 20, 1
# 30, 3 식으로 키와 값을 엮었다.
# [(1, 10), (1, 20), (1, 50), (2, 40), (2, 60), (3, 30)]
# -1은 튜플의 맨 마지막 (3, 30), 1은 튜플 내의 1번째 요소(30)을 꺼내온것.


전체코드

a = []
a_dict = {}

for _ in range(10):
    N = int(input())
    a.append(N)
    
for i in a: 
    if i not in a_dict: # 입력값이 딕셔너리 안에 없으면 
        a_dict[i] = 1 # 카운트 1
    else:
        a_dict[i] += 1 # 카운트 1 증가

ave_result = int(sum(a) / 10)

print(ave_result)
print(sorted(list(zip(a_dict.values(), a_dict.keys())))[-1][1])

관심있을 포스팅