파이썬 알고리즘 122번 | [백준 2108번] 통계학

Yunny.Log ·2022년 2월 23일
0

Algorithm

목록 보기
125/318
post-thumbnail

122. 통계학

1) 어떤 전략(알고리즘)으로 해결?

2) 코딩 설명

<내 풀이>



arr=[]
n=int(input())
for i in range(n):
    arr.append(int(input()))
arr.sort()
chk=[0]*8001
maxchk=-1
collectmax=[]
# 첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
print(round(sum(arr)/n))
# 둘째 줄에는 중앙값을 출력한다.
if n%2==0:
    print((arr[n//2]+arr[n//2-1])//2)
else : 
    print(arr[n//2])
# 셋째 줄에는 최빈값을 출력한다. 
# 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
for i in range(n):
    if arr[i]<0:
        chk[abs(arr[i])+4000]+=1
        if maxchk<chk[abs(arr[i])+4000]:
            maxchk=chk[abs(arr[i])+4000]
    else:
        chk[arr[i]]+=1
        if maxchk<chk[arr[i]]:
            maxchk=chk[arr[i]]

cnt=-1
for j in chk:
    cnt+=1
    if j==maxchk:
        if cnt>4000:
            cntcpy=cnt
            cntcpy=-(cntcpy-4000)
            collectmax.append(cntcpy)
        else :
            collectmax.append(cnt)
collectmax.sort()
if len(collectmax)>1:
    print(collectmax[1])
else : 
    print(collectmax[0])

# 넷째 줄에는 범위를 출력한다.
print(max(arr)-min(arr))

=> 시간 초과 걸리네...max,min은 안 쓸 수 있을 것 같아서 그거 수정해서 pypy로 돌리니깐 됨

import sys


arr=[]
n=int(input())
for i in range(n):
    arr.append(int(input()))
arr.sort()
chk=[0]*8001
maxchk=-1
collectmax=[]
# 첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
print(round(sum(arr)/n))
# 둘째 줄에는 중앙값을 출력한다.
if n%2==0:
    print((arr[n//2]+arr[n//2-1])//2)
else : 
    print(arr[n//2])
# 셋째 줄에는 최빈값을 출력한다. 
# 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
for i in range(n):
    if arr[i]<0:
        chk[abs(arr[i])+4000]+=1
        if maxchk<chk[abs(arr[i])+4000]:
            maxchk=chk[abs(arr[i])+4000]
    else:
        chk[arr[i]]+=1
        if maxchk<chk[arr[i]]:
            maxchk=chk[arr[i]]
cnt=-1
for j in chk:
    cnt+=1
    if j==maxchk:
        if cnt>4000:
            cntcpy=cnt
            cntcpy=-(cntcpy-4000)
            collectmax.append(cntcpy)
        else :
            collectmax.append(cnt)
collectmax.sort()
if len(collectmax)>1:
    print(collectmax[1])
else : 
    print(collectmax[0])

# 넷째 줄에는 범위를 출력한다.
print(arr[-1]-arr[0])
  • 음수 같은 경우에는 index error가 나타나니, 음수에 절댓값을 취한 뒤 4000을 더해준 것을 인덱스로 삼았다.

<반성 점>

  • 문제 조건을 제대로 읽지 않았던 점, 정수를 입력받을 수 있다고 하는 건 음수도 생각해줬어야 함

<배운 점>

  • 파이썬 나눈거 소수점 한자리에서 반올림 round(실수,n)
  • sys 로 빠르게 입력받기

0개의 댓글