2108번 - 통계학
import sys
from collections import Counter
n = int(sys.stdin.readline())
data = [int(sys.stdin.readline()) for i in range(n)]
s = round(sum(data)/n)
a = sorted(data)[int((n-1)/2)]
rng = (max(data))-(min(data))
count = Counter(data).most_common()
most_com_num = []
if n == 1:
q = count[0][0]
else:
for i in range(0, len(count)):
if count[0][1] == count[i][1]:
most_com_num.append(count[i])
else:
q = count[0][0]
if len(most_com_num) == 1:
q = most_com_num[0][0]
else:
most_com_num.remove(min(most_com_num))
q = min(most_com_num)[0]
print(s)
print(a)
print(q)
print(rng)
입력 받기
추가 설명 - 본문2
import sys
n = int(sys.stdin.readline())
data = [int(sys.stdin.readline()) for i in range(n)]
sys
의 stdin.readline()
을 이용해 입력 받는다.
평균, 중앙값, 범위
s = round(sum(data)/n)
a = sorted(data)[int((n-1)/2)]
rng = (max(data))-(min(data))
s
를 이용해 평균을 구할 예정이다. s
를 n
으로 나누면 평균이 된다. 소수 첫째 자리에서 반올림 해야 하므로 round()
를 씌워주면 된다.
rng
는 그 자체로 이미 범위이다. max
값에서 min
값을 빼 주면 된다.
a
는 입력 받은 숫자들을 오름차순으로 정렬한 것으로 중앙값을 찾는데 이용한다. n이 홀수라고 문제에서 가정했으므로 (n-1)/2
를 해도 되고, n//2
를 해도 무방하다. 필자는 전자를 선택했다. int()
를 씌워줘 정수가 아닌 자연수로 출력해 준다.
print(s)
print(a)
print(rng)
최빈값
from collections import Counter
count = Counter(data).most_common()
최빈값을 찾기 위해 collections
의 Counter
를 이용한다.
most_com_num = []
for i in range(0, len(count)):
if count[0][1] == count[i][1]:
most_com_num.append(count[i])
else:
q = count[0][0]
if len(most_com_num) == 1:
q = most_com_num[0][0]
else:
most_com_num.remove(min(most_com_num))
q = min(most_com_num)[0]
최빈값이 여러개일 경우 두 번째로 작은 값을 출력해야 하므로 필자는 모든 최빈값들을 새로운 리스트 most_com_num
에 담았다. 최빈값들은 count[0]
과 개수가 같을 것이므로 if 문을 이용해 선별했다. 만약 최빈값이 하나만 존재 한다면 그냥 출력 할 수 있도록 else
에 필요한 코드를 적었다.
if len(most_com_num) == 1
이 부분은 나중에 설명하기로 하고, 마지막 else
에서 여러 최빈값들 중 가장 작은 값을 제거한 후 남은 최빈값들 중 다시 가장 작은 값을 변수 q에 할당했다.
값이 하나만 들어오는 경우
if n == 1:
q = count[0][0]
문제의 예제 입력 2 처럼 값이 하나만 들어오는 경우는 위와 같이 따로 처리해 주었다.
위에서 설명하지 않고 넘어간 if len(most_com_num) == 1
부분도 마찬가지인데, 예제 입력 4와 같이 0, 0, -1 처럼 입력되는 경우 0이 most_com_num
에 추가되고, remove()
때문에 제거되어 most_com_num
가 다시 빈 리스트가 되어버린다. 이 문제를 해결하기 위해 most_com_num
에 하나의 값만 들어가있을 경우 그 값을 출력하도록 해 주었다.
if len(most_com_num) == 1:
q = most_com_num[0][0]