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
와 같은 경우 동률에 대한 처리를 위한 리스트에 키값을 추가한다.최빈값 구하기 함수 전체코드
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)