[TIL] 2023-08-29 코테 (구현 1문제)

thousand_yj·2023년 8월 31일
0

TIL

목록 보기
4/14

구현

실버3. 백준 2108 통계학

풀이

문제에서 제시한 조건대로 풀면 된다. 파이썬은 내장 모듈이 잘 되어 있어 간편하다.

산술평균 : N개의 수들의 합을 N으로 나눈 값, 소수점 이하 첫째 자리에서 반올림한 값 -> sum(), round() 사용
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값 -> sort() 사용, N은 홀수만 등장
최빈값 : N개의 수들 중 가장 많이 나타나는 값 -> Counter 라이브러리의most_common() 메서드 사용, 여러개의 최빈값이 등장하는 경우 고려
범위 : N개의 수들 중 최댓값과 최솟값의 차이 -> min(), max() 사용

여러개의 최빈값이 등장하는 경우를 고려하기 위해 등장빈도를 저장한 배열 c_nums을 반복문으로 돌면서 만약 가장 많이 등장한 데이터가 여러개인 경우 most_common_arr에 저장해주었다. 최빈값이 아닌 데이터가 등장하는 경우 바로 반복문을 탈출해주면 된다. (break 안 적어주면 등장 빈도가 같은 데이터가 모두 들어가서 오답)

코드

from sys import stdin
from collections import Counter

input = stdin.readline

N = int(input())

nums = [int(input()) for _ in range(N)]

# 산술평균 : N개의 수들의 합을 N으로 나눈 값. 소수점 이하 첫째 자리에서 반올림한 값
print(round((sum(nums) / N)))

# 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
nums.sort()
print(nums[N // 2])

# 최빈값 : N개의 수들 중 가장 많이 나타나는 값
c_nums = Counter(nums).most_common()
most_common_arr = []
first = True

for i in range(len(c_nums)):
    if first:
        most_common_arr.append(c_nums[i][0])
    if i + 1 < len(c_nums) and c_nums[i][1] == c_nums[i + 1][1]:
        most_common_arr.append(c_nums[i + 1][0])
    else:
        first = False
        break


# 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
if len(most_common_arr) == 1:
    print(most_common_arr[0])
else:
    most_common_arr.sort()
    print(most_common_arr[1])

# 범위 : N개의 수들 중 최댓값과 최솟값의 차이
print(max(nums) - min(nums))
profile
함께 일하고 싶은 개발자가 되기 위해 노력합니다. 코딩테스트 관련 공부 및 이야기는 티스토리에도 업로드되어 있습니다.

0개의 댓글