[Python]BaekJoon.AC

[Python]백준 BaekJoon.AC 2108 : 통계학(Counter, sum)

스뇨잉 2022. 1. 20. 04:29
728x90
728x90

 

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

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

 

 

우선 N이 1일 때는 모든 계산에서 예외처리 해줬다. 코드대로 한다면 엉뚱한 답이 나오기에.

전체코드에서 for문부터 나름 1~4번째 출력값별로 단락을 나눠 구별해줬는데... 알아보기 편하려나.

 

 

 

-먼저 sum을 이용해 리스트 값을 더해 산술평균을 구했다. round 처리해 반올림도 잊지 않았다.

 

 

-리스트를 오름차순으로 정렬한 후, N//2번째 리스트 값으로 중앙값을 구해주고.

 

 

-대망의 최빈값인데. 힘겹게 코드를 일일이 다 구현해줬더니 시간초과가 발생했다. 역시 만들어둔게 좋은 것...ㅋㅋ

Counter를 이용해줬다. Counter는 예시로 이해하는 편이 쉽다. 

 

ex)

a = Counter('hello')
print(a)

출력 : Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})

 

a = Counter('hello').most_common()
print(a)
print(a[0][0], a[0][1])

출력 : [('l', 2), ('h', 1), ('e', 1), ('o', 1)]
출력 : l 2

 

a = Counter('hello').most_common(2)
print(a)

출력 : [('l', 2), ('h', 1)]

 

이 문제에선 조건이 더 있기 때문에 most_common을 이용해 최빈값 2개를 뽑아낸다.

 

<헛다리 탐구>

더보기

 어 그런데.. 하다보니 이상한 점을 발견했다.

a = Counter([2, 2, 5, 5, 4, 4, 0]).most_common(2)
print(a)

출력 : [(2, 2), (5, 2)]

 

입력순서대로 2가지를 처리해주는 것 같은데.. 이렇게 되면 내가 적은 코드는 5를 최빈값으로 도출해낼 듯 싶다. 정답은 4인데.

라고 생각했다가 곧바로 이유를 알게 됐다!ㅋㅋ 내가 이전에 리스트를 오름차순으로 정렬해줬기 때문에, 오히려 위 코드의 입력값에 오류가 있다고 볼 수 있겠다. [0, 2, 2, 4, 4, 5, 5]로 입력될테니 내 제출이 틀리지 않았던 것...!

우연찮게 새로운 지식을 얻게 되었다ㅋㅋㅋ 굿

 

 

-마지막 범위는 그리 어렵지 않게 구현 가능하다.

 

 

 

import sys
from collections import Counter

N = int(input())
if N == 1:
    n = int(sys.stdin.readline())
    print(n)
    print(n)
    print(n)
    print(0)
    quit()

nums = []

for i in range(N):
    nums.append(int(sys.stdin.readline()))
print(round(sum(nums)/N))

nums.sort()
print(nums[N//2])

three = Counter(nums).most_common(2)
if three[0][1] == three[1][1]:
    print(max(three[0][0], three[1][0]))
else:
    print(three[0][0])

print(abs(nums[N-1]-nums[0]))

 

728x90
728x90