CodingTest/Baekjoon

[baekjoon] 백준 2108번(파이썬): 통계학

JunJangE 2021. 11. 2. 16:01

문제

 

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