[BOJ] 2108번: 통계학

HyeRyun·2021년 2월 21일
0

Baekjoon Online Judge

목록 보기
23/30

✔️ 문제

수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.

산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.


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

[출력]
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

둘째 줄에는 중앙값을 출력한다.

셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.

넷째 줄에는 범위를 출력한다.

😎 소스 코드

N = int(input())
number = list(int(input()) for _ in range(N))

sortedNum = sorted(number)

# 1. 산술평균
avg = round(sum(number) / N)
print(avg)

# 2. 중앙값
mid = sortedNum[N // 2]
print(mid)

# 3. 최빈값
repeat = []
count = 1

# 반복되는 숫자 카운트
for i in range(N-1):
	if sortedNum[i] == sortedNum[i+1]:
		count += 1 # 현재 숫자 카운트
	else:
		repeat.append(count)
		count = 1

repeat.append(count) # 마지막 숫자

# max index 찾기
maxValue = max(repeat)
maxIndex = []

for k in range(len(repeat)):
	if repeat[k] == maxValue:
		maxIndex.append(k)

# 최빈값 중 두 번째로 작은 값을 원래 리스트에서 찾음
temp = 0
if len(maxIndex) == 1:
	# 최빈값이 하나
	for index in range(maxIndex[0]):
		temp += repeat[index]
	print(sortedNum[temp])
else:
	# 최빈값이 여러개
	for j in range(maxIndex[1]+1):
		temp += repeat[j]
	print(sortedNum[temp-1])

# 4. 범위
diff = abs(sortedNum[0]-sortedNum[-1])
print(diff)

✊ 문제를 풀고 나서

최빈값 출력하는게 어려웠다.. 뭔가 좀 복잡하게 푼 것 같은데 내 풀이법은 이렇다.


  1. 입력된 숫자를 오름차순으로 정렬한다. 파이썬의 내장 함수인 sorted를 이용함

  2. 리스트 내에서 반복되는 값이 있는지 확인한다. count의 초기값은 1로 설정했고, 만약 현재의 값과 오른쪽 인덱스의 값이 같다면(=반복된다면) repeat리스트에 count 값 만큼 삽입한다.

  3. 리스트의 기본 함수인max 이용하여 repeat의 최대값(maxValue)을 뽑아낸다. 최빈값이 여러 개일 경우가 있으므로 (=repeat 리스트 내에서 최대값이 여러 개) 이 경우에는 maxValue와 인덱스가 같은 값(k)을maxIndex에 삽입한다.

  4. 최빈값이 하나: 원래 리스트 인덱스의 누적만큼 해당하는 원소를 출력

  5. 최빈값이 여러 개일 경우: 문제에서 두번째로 작은 값을 출력하라고 했으므로 maxIndex[1]을 사용했다.


이런 식으로 풀었다. 얼핏 보고 간단한 문제같아서 풀기 시작했다가 최빈값 구하는 코드에서 굉장히 머리 아팠던 문제였다. 정답률 낮은 이유가 있었어...

profile
개발개발

0개의 댓글