문제
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
출력
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
예제 입력 1
5
1
3
8
-2
2
예제 출력 1
2
2
1
10
예제 입력 2
1
4000
예제 출력 2
4000
4000
4000
0
예제 입력 3
5
-1
-2
-3
-1
-2
예제 출력 3
-2
-2
-1
2
예제 입력 4
3
0
0
-1
예제 출력 4
0
0
0
1
위 문제는 사실 생각을 요하는 문제는 아니었습니다. 시간도 충분하기도 했고 요구하는 내용 상에 이해가 되지 않는 부분도 없다시피 했습니다. 받은 수를 정리하고 다루는 능력을 가지고 있는지 확인하는 문제로 판단됩니다.
산술평균은 우리가 익히 하든 평균 구하는 공식을 사용해서 결과를 도출하라는 것이었습니다.
중앙값은 위 문제에서 입력은 항상 홀수로 주어진다고 했기 때문에 리스트를 정렬 시켰을 때 중앙에 있는 인덱스의 값을 물어보는 것입니다.
최빈값은 파이썬의 딕셔너리(Dictionary)를 활용해서 Hash를 한다면 쉽게 구할 수 있습니다.
범위는 주어진 수들로 이뤄진 리스트에서 가장 큰 값과 가장 작은 값을 찾아서 빼주면 됩니다.
파이썬은 이런 수, 문자를 다루기 매우 쉬운 언어라서 해결하기 수월했습니다.
N = int(input())
problemArr = []
problemDict = {}
for _ in range(N):
num = int(input())
problemArr.append(num)
if num in problemDict:
problemDict[num] += 1
else:
problemDict[num] = 1
ariMean = sum(problemArr) / N # 산술평균
ariMean = round(ariMean)
print(ariMean)
problemArr.sort()
print(problemArr[len(problemArr) // 2]) # 중앙값
P = list(problemDict.items())
P = sorted(P, key=lambda X: (-X[1], X[0]))
if len(P) >= 2:
if P[0][1] == P[1][1]:
print(P[1][0])
else:
print(P[0][0]) # 최빈값
else:
print(P[0][0]) # 최빈값
rangeMax = max(problemArr)
rangeMin = min(problemArr)
print(rangeMax - rangeMin) # 범위
최빈값을 구할 때 딕셔너리를 키와 값이 튜플로 이뤄져서 리스트를 이루고 있습니다. 그것을 가장 많이 나온 빈도인 X[1]에 대해 내림차순 정렬을 하게 되고, 같은 경우에 대해서는 작은 값이 앞으로 정렬되도록 하여 값을 찾게 했습니다
위 문제에서 고려해야 할 부분은 만약 값이 하나일 경우에는 두 번째로 작은 값이 존재하지 않으므로 예외처리를 해줬습니다. 또한, 맨 앞에 있는 것이 최빈값이고 그 다음 것은 최빈값은 아닐 경우, 이는 가장 맨 앞에 값을 출력해줘야 합니다. 문제에서 말하는 것은 최빈값(즉 가장 많은 빈도로 나온 값)이 2개 이상일 때 가장 작은 수가 아닌 그 다음 수, 2번째로 작은 수를 출력하라고 한 것입니다. 그래서 P[0][1] == P[1][1]을 통해서 빈도값이 같은 경우 2개 이상이라면 P[1][0]에 들어있는 2번째로 작은 수를 출력하도록 했습니다. 복잡한 부분은 없었지만 수를 활용하는 사고력을 높이는데 좋은 문제였습니다
이번에 산술 평균을 구하는 부분을 코드로 작성하면서 평균을 구하는 여러 방법이 파이썬에 존재하는 것을 알게되어 별도로 정리를 했습니다.
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 2805번 나무자르기 - Python (0) | 2023.03.08 |
---|---|
백준 18111번 마인크래프트 - Python (1) | 2023.03.08 |
백준 4949번 균형잡힌 세상 - Python (0) | 2023.03.06 |
백준 11651번 좌표 정렬하기2 - Python (0) | 2023.03.05 |
백준 1966번 프린터 큐 - Python (0) | 2023.03.04 |