algorithm/python

백준/2108/통계학

아르르르를를르 2021. 10. 27. 14:18

시간초과로 여러번 통과하지 못했던 문제이다.

로직이 맞는 것 같은데 시간초과 뜬다면 input() 을 의심해보아야 한다.

몇 번의 input을 더 받아야하는지 알고 있다면 (대부분의 문제의 첫 값은 for문 돌아야 할 횟수를 알려준다)

다음을 활용하도록 하자.

input() -> sys.stdin.readline()

 

풀이)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

def main(n, input_num):
    # 산술평균 : N개의 수들의 합을 N으로 나눈 값
    print(int(round(sum(input_num) / n)))
    
    # 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
    sorted_num = sorted(input_num)
    print(sorted_num[int(n / 2)])
    
    # 최빈값 : N개의 수들 중 가장 많이 나타나는 값
    print(most_frequent(sorted_num))
    
    # 범위 : N개의 수들 중 최댓값과 최솟값의 차이
    print(sorted_num[-1] - sorted_num[0])


def most_frequent(arr):
    temp = dict()
    for item in arr:
        if temp.get(item):
            temp[item] += 1
        else:
            temp[item] = 1

    maxNum = 0
    ans = []
    for k, v in temp.items():
        if v > maxNum:
            ans = []
            ans.append(k)
            maxNum = v
        elif v == maxNum:
            ans.append(k)
            maxNum = v
            
    if len(ans) == 1:
        return ans[0]
    else:
        return sorted(ans)[1]


if __name__ == "__main__":
    n = int(input())
    input_num = []
    for i in range(n):
        input_num.append(int(sys.stdin.readline()))

    main(n, input_num)