본문 바로가기
백준

[백준] 2108번 : 통계학 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 12. 11.
728x90
반응형

 

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

1. 문제 설명

2. 풀이과정

  1. sys.stdin.readline() 함수를 사용하기 위해 sys 모듈을 불러온다. import sys
  2. 수의 개수를 입력받는다. N = int(sys.stdin.readline())
  3. 각 수를 저장할 리스트를 생성하고 li = []
  4. 각 수가 입력되는 횟수를 저장할 딕셔너리를 생성한다. d = {}
  5. 수의 개수만큼 반복하며 for i in range(N)
  6. 각 수를 입력받고 num = int(sys.stdin.readline())
  7. 만약 해당 수가 이미 딕셔너리에 있으면 if (num in d)
  8. 딕셔너리에서 해당 수의 횟수를 증가시킨다. d[num] += 1
  9. 반면에 해당 수가 딕셔너리에 없는 처음 입력된 수라면 else
  10. 딕셔너리에 해당 수의 횟수를 추가한다. d[num] = 1
  11. 그리고 모든 수는 리스트에 추가된다. li.append(num)
  12. 우선 첫 번째로 산술평균값을 출력한다. 산술평균값은 입력된 모든 수를 더하고 개수로 나눈 값이다. 첫째 자리에서 반올림한 결과이므로 정수형으로 출력하면 된다. print(round(sum(li) / N))
  13. 리스트를 오름차순으로 정렬하여 li.sort()
  14. 두 번째로 중앙값을 출력한다. 중앙값은 오름차순으로 정렬한 수의 가운데 값이다. print(li[int((N - 1) // 2)])
  15. 세 번째로 최빈값을 출력해야 하는데, 최빈값을 출력하기 위해 각 수의 횟수를 저장해 둔 딕셔너리를 수를 기준으로 오름차순 정렬하고 d = sorted(d.items(), key = lambda x : x[0])
  16. 횟수를 기준으로 내림차순 정렬한다. d = sorted(d, key = lambda x : x[1], reverse=True)
  17. 가장 많이 나온 수의 횟수를 저장한다. max = d[0][1]
  18. 최빈값이 여러 개이면 최빈값 중 두 번째로 작은 수를 출력하면 되기 때문에 정렬한 딕셔너리에서 그다음 값만 확인하면 된다. 만약 입력된 수가 2개 이상이고, 다음 수의 횟수가 최빈값과 동일하면 if (len(d) >= 2) and (d[1][1] == max)
  19. 최빈값 중 두 번째로 작은 수인 다음 수를 출력하면 되고 print(d[1][0])
  20. 다음 수가 최빈값이 아니라면 그냥 제일 앞 최빈값의 수를 출력하면 된다. else: print(d[0][0])
  21. 마지막으로 수의 범위를 최댓값 - 최솟값으로 구하여 출력하면 된다. print(li[-1] - li[0])
반응형

3. 소스코드

import sys

N = int(sys.stdin.readline())

li = []
d = {}
for i in range(N):
    num = int(sys.stdin.readline())
    if (num in d):
        d[num] += 1
    else:
        d[num] = 1

    li.append(num)

print(round(sum(li) / N))

li.sort()
print(li[int((N - 1) // 2)])

d = sorted(d.items(), key = lambda x : x[0])
d = sorted(d, key = lambda x : x[1], reverse=True)

max = d[0][1]
if (len(d) >= 2) and (d[1][1] == max):
    print(d[1][0])
else:
    print(d[0][0])

print(li[-1] - li[0])
728x90
반응형