[BOJ 백준] - 통계학 2108 Python

Kim Dae Hyun·2021년 10월 31일
0

Algorithm

목록 보기
21/29
post-thumbnail

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

n개의 정수가 입력될 때 입력받은 정수들로 아래 4가지 연산을 수행해야 한다.

  • 평균 (소수점 첫째 자리에서 반올림)
  • 중앙값
  • 최빈값
  • 범위 (최대값 - 최소값)

최빈값을 제외한 나머지 연산을 간단하다.
각 연산을 함수로 구현했다. 각 함수는 매개변수로 입력받은 정수로 이루어진 정렬된 리스트를 받는다.

def average(nums):
    return round(sum(nums) / len(nums))

def median(nums):
    return nums[len(nums) // 2]

def nums_range(nums):
    return nums[-1] - nums[0]

핵심은 최빈값을 구하는 부분인데 이 문제를 더 어렵게 한 조건은 아래 조건이다..

  • 최빈값이 여러 개라면 여러 값 중 두번째로 작은 값을 출력한다.

일단 최빈값을 구해보자.
구하는 방식은 굉장히 여러 개가 있겠지만 나는 딕셔너리를 사용했다. 처음에는 정수범위가 4000으로 좀 작길래 리스트로 만들었는데 음수까지 고려해야 하다보니 어려움이 있었다.

아래처럼 n이라는 숫자가 있을 때 n을 key로 빈도수를 value로 하는 방식으로 구현했다.

def mod(nums):
    dic = {}
    for i in range(len(nums)):
        n = nums[i]
        if n in dic:
            dic[n] += 1
        else:
            dic[n] = 1

이제 입력받은 모든 숫자들의 빈도수가 저장된 딕셔너리를 만들었으므로 최빈값을 찾고 동률에 대한 처리를 해줘야 한다.

  • 현재 빈도수가 most 보다 큰 경우 현재 빈도수를 most로 갱신한다.
  • most가 갱신되었다면 동률에 대한 처리를 위한 리스트를 초기화하고 현재 키 값을 리스트에 추가한다.
  • 현재 빈도수가 most와 같은 경우 동률에 대한 처리를 위한 리스트에 키값을 추가한다.
  • 반복을 마치고 동률 처리 리스트의 길이가 2 이상이라면 동률이 있다는 것이므로 오름차순 정렬해서 두번째 값을 뽑아낸다. (두번째로 작은 값 출력)

최빈값 구하기 함수 전체코드

def mod(nums):
    dic = {}
    for i in range(len(nums)):
        n = nums[i]
        if n in dic:
            dic[n] += 1
        else:
            dic[n] = 1

    most = 0 
    eq_list = [] # 최빈값 동률 처리를 위한 리스트
    for k, v in dic.items():
        if v > most: # 더 큰 값 찾았을 때
            most = v
            eq_list.clear()
            eq_list.append(k)
        elif v == most: # 현재 최빈값과 같을 때
            eq_list.append(k)


    eq_list = sorted(eq_list)
    if len(eq_list) >= 2:
        return eq_list[1]
    return eq_list[0]

전체코드


def average(nums):
    return round(sum(nums) / len(nums))

def median(nums):
    return nums[len(nums) // 2]

def nums_range(nums):
    return nums[-1] - nums[0]

def mod(nums):
    dic = {}
    for i in range(len(nums)):
        n = nums[i]
        if n in dic:
            dic[n] += 1
        else:
            dic[n] = 1

    most = 0
    eq_list = []
    for k, v in dic.items():
        if v > most: # 더 큰 값 찾았을 때
            most = v
            eq_list.clear()
            eq_list.append(k)
        elif v == most: # 현재 최빈값과 같을 때
            eq_list.append(k)



    if len(eq_list) >= 2:
        eq_list = sorted(eq_list)
        return eq_list[1]
    return eq_list[0]



n = int(input())

nums = []
for _ in range(n):
    nums.append(int(input()))

nums = sorted(nums)

avg = average(nums)
med = median(nums)
mod = mod(nums)
range = nums_range(nums)

print(avg)
print(med)
print(mod)
print(range)


profile
좀 더 천천히 까먹기 위해 기록합니다. 🧐

0개의 댓글