문제
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
알고리즘
- 산술 평균은 round() 함수를 통해 수행한다.
- 중앙값은 오름차순으로 정렬 후 중간에 있는 정수를 출력한다.
- 최빈값은 collection 모듈의 Counter 클래스를 사용한다.(Counter 클래스에서도 most_common() 함수를 사용해도 됨)
- 범위는 최댓값에서 최솟값을 빼준 값을 출력한다.
코드
import sys
from collections import Counter
n = int(sys.stdin.readline())
m = [int(sys.stdin.readline()) for _ in range(n)]
# 산술 평균
print(round(sum(m) / n))
# 중앙 값
m.sort()
print(m[n//2])
# 최빈값
cnt = Counter(m)
m = sorted(list(set(m)))
res = []
for i in m:
# 현재 숫자의 개수가 가장 많은 개수라면
if cnt[i] == max(cnt.values()):
res.append(i) # 리스트에 추가
# 리스트가 2개 이상일 경우 반복을 멈춘다.
if len(res) >= 2:
break
# 리스트의 개수가 1개일 경우 첫 번째 수를 출력
if len(res) == 1:
print(res[0])
# 리스트가 2개일 경우 두 번째 수를 출력
else:
print(res[1])
# 범위
print(max(m) - min(m))
또 다른 성공 코드
import sys
from collections import Counter
n = int(sys.stdin.readline())
m = [int(sys.stdin.readline()) for _ in range(n)]
# 산술 평균
print(round(sum(m) / n))
# 중앙 값
m.sort()
print(m[n//2])
# 최빈값
cnt = Counter(m).most_common(2) # 가장 개수가 많은 k개의 데이터를 리턴
# 데이터가 2개 이상일 경우
if len(cnt) > 1:
# 2개의 데이터의 value 값이 같은지 확인
# 같다면 두 번째 key 값을 출력
if cnt[0][1] == cnt[1][1]:
print(cnt[1][0])
# 다르다면 첫 번째 key 값을 출력
else:
print(cnt[0][0])
# 데이터가 하나라면 첫 번째 key 값을 출력
else:
print(cnt[0][0])
# 범위
print(max(m) - min(m))
문제를 수행하고 다른 사람들의 코드를 봤더니 Counter 클래스에 common() 함수를 알게되었고 common() 함수를 통해 문제를 풀면 코드가 간결해지고 더 빠른 속도로 문제를 수행할 수 있게 되는 것을 알게되었다.
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 2078번(파이썬): 무한이진트리 (1) | 2021.11.04 |
---|---|
[baekjoon] 백준 13116번(파이썬): 30번 (0) | 2021.11.03 |
[baekjoon] 백준 3584번(파이썬): 가장 가까운 공통 조상 (0) | 2021.11.02 |
[baekjoon] 백준 2263번(파이썬): 트리의 순회 (0) | 2021.11.01 |
[baekjoon] 백준 9934번(파이썬): 완전 이진 트리 (0) | 2021.10.31 |