백준 :: 통계학 <2108번>

혜 콩·2022년 5월 28일
0

알고리즘

목록 보기
21/61

> 문제 <

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

> 아이디어 <

  • 시간 초과
    1번째 코드에서 .count 때문에 시간 초과가 발생하였다.
    → 3번째 블록의 딕셔너리 dict[n] = 1로 변경해주고,
    → count 대신 현재 원소 값이 이전 원소 값과 동일하다면 dict[i] value값에 + 1
    시간 초과 해결 (success)

> 코드 <

# mine (시간 초과)

import sys

N = int(sys.stdin.readline())
nums = []
dict = {}

for _ in range(N):
    n = int(sys.stdin.readline())
    nums.append(n)
    if n not in dict:
        dict[n] = 0

n = len(nums)
sp = sum(nums) / n

nums.sort()
mid = nums[n//2]

for i in nums:
    dict[i] = nums.count(i)             # ✅
m_key = [k for k, v in dict.items() if max(dict.values()) == v]           # 최대 value 값에 대한 key 값 반환

if len(m_key) == 1:          # 최빈값
    mode = m_key[0]
else:                       # 최빈값이 여러 개일 때, 2번째로 작은 값 출력
    m_key.sort()
    mode = m_key[1]

r = abs(max(nums) - min(nums))

print(round(sp), mid, mode, r, sep='\n')
# mine (수정, success)

import sys

N = int(sys.stdin.readline())
nums = []
dict = {}

for _ in range(N):
    n = int(sys.stdin.readline())
    nums.append(n)
    if n not in dict:
        dict[n] = 1               # ✅

n = len(nums)

sp = sum(nums) / n
nums.sort()
mid = nums[n//2]

# 최빈값
for i in range(1, len(nums)):
    if nums[i-1] == nums[i]:                       # ✅
        dict[nums[i]] += 1

m_key = [k for k, v in dict.items() if max(dict.values()) == v]           # 최대 value 값에 대한 key 값 반환

if len(m_key) == 1:          # 최빈값
    mode = m_key[0]
else:                       # 최빈값이 여러 개일 때, 2번째로 작은 값 출력
    m_key.sort()
    mode = m_key[1]

r = abs(max(nums) - min(nums))

print(round(sp), mid, mode, r, sep='\n')

> 더 좋은 라이브러리 <

개수를 체크할 때 Counter 라이브러리 사용

from collections import Counter

s = [1,4,2,2,4,1,3,6,7]
cs = Counter(s)

print(cs)
print(cs.most_common())
print(cs.most_common(1))
# 가장 많은 것부터 1개 출력

profile
배우고 싶은게 많은 개발자📚

0개의 댓글