2108: 통계학 - Python

beaver.zip·2024년 5월 22일
0

[알고리즘] 백준

목록 보기
2/45

문제

https://www.acmicpc.net/problem/10773

풀이 1 (오답)

from collections import Counter

n = int(input())
arr = [0] * n # 속도 향상을 위해 0으로 초기화
for i in range(n): # n개의 정수를 입력 받아 arr에 저장
    arr[i] = int(input())
arr.sort()

print(round(sum(arr)/n)) # 산술 평균
print(arr[n//2]) # 중앙값

# 최빈값 - Counter 함수 사용
common = sorted(Counter(arr).most_common())
if len(common) == 1:
    print(common[0][0])
else:
    print(common[1][0])

print(arr[-1] - arr[0]) # 범위

최빈값 구하는 게 어려워서 헤매다가 Counter 함수를 억지로 맞춰 끼웠다.
하지만 틀렸다.

풀이 2 (오답 - 시간초과)

from collections import Counter

n = int(input())
arr = [0] * n
for i in range(n):
    arr[i] = int(input())
arr.sort()

print(round(sum(arr)/n))
print(arr[n//2])

common = Counter(arr).most_common()
if len(common) == 1:
    print(common[0][0])
elif common[0][1] == common[1][1]:
    print(common[1][0])
else:
    print(common[0][0])

print(arr[-1]-arr[0])

최빈값을 구할 때, 조건을 올바르게 정정했다.
그러나 시간 초과가 발생했다.

풀이 3 (정답)

from collections import Counter
import sys

input = sys.stdin.read
data = input().split()

n = int(data[0])
arr = list(map(int, data[1:n+1]))
arr.sort()

print(round(sum(arr)/n))
print(arr[n//2])

common = Counter(arr).most_common()
if len(common) == 1:
    print(common[0][0])
elif common[0][1] == common[1][1]:
    print(common[1][0])
else:
    print(common[0][0])

print(arr[-1]-arr[0])

풀이 2에서 시간 초과가 발생해서
GPT 선생님께 입력 부분을 개선해달라고 했는데, 아래 내용을 개선해주었다.

import sys

input = sys.stdin.read
data = input().split()

n = int(data[0])
arr = list(map(int, data[1:n+1]))

개선점

  1. input() -> sys.stdin.read
  2. 초기화 후 for문으로 대입 -> input().split() 후 map(int)로 한번에 입력

풀이 4 (참고: This is Mi님 풀이)

풀이 3보다 속도는 조금 더 걸리지만 메모리를 훨씬 적게 쓰는 훌륭한 코드이다.

import sys

input = sys.stdin.readline

n = int(input())
data = []

_sum = 0
count = dict()
for _ in range(n):
    x = int(input())
    data.append(x)

    _sum += x

    if x not in count:
        count[x] = 1
    else:
        count[x] += 1

data.sort()

# 산술평균
print(round(_sum/n))

# 중앙값
print(data[n//2])

# 최빈값
freq = max(count.values())
numbers = []
for key, value in count.items():
    if value == freq:
        numbers.append(key)

if len(numbers) == 1:
    print(numbers[0])
else:
    print(sorted(numbers)[1])

# 범위
print(data[-1] - data[0])

풀이 3이 어거지라고 생각했는데, 다른 분들 풀이를 보니 다들 비슷하게 푸신 것 같다.
그냥 어거지 문제였나보다 !-!

오늘의 교훈

  • 실행 시간을 줄이기 위해 입력을 개선하도록 하자.
    -> input() ~> sys.stdin.readline
    -> input().split()과 map()을 적절히 사용해보자.
profile
NLP 일짱이 되겠다.

0개의 댓글