https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
정답코드
import sys
N =int(input())
stack=[]
for i in range(N):
stack.append(int(sys.stdin.readline()))
stack.sort()
def rangeto_stack(stack):
stack.sort()
if len(stack)==1:
return print(0)
else:
r = stack[-1]-stack[0]
return print(r)
#최빈값 구하는 함수
def frequency_num(stack):
if len(stack)==1:
return print(stack[0])
else:
dic={}
for value in stack:
if value in dic:
dic[value]+=1
else:
dic[value] =1
mx = max(dic.values()) # 빈도수 중 최대값 구하기
mx_dic = []
for i in dic:
if mx ==dic[i]: # 최빈값의 key저장
mx_dic.append(i)
if len(mx_dic)>1:
return print(mx_dic[1])
else:
return print(mx_dic[0])
# output
print(round(sum(stack)/N)) #산술평균, 첫째자리 반올림
print(stack[len(stack)//2]) #중앙값
frequency_num(stack) #최빈값중 두번째로 작은값
rangeto_stack(stack) #범위
최빈값을 어떻게 구할지. -> 딕셔너리를 이용하자
key 에는 element, value에서 count (빈도수)
#최빈값 구하는 함수
def frequency_num(stack):
if len(stack)==1:
return print(stack[0])
else:
dic={}
for value in stack:
if value in dic:
dic[value]+=1
else:
dic[value] =1
mx = max(dic.values()) # 빈도수 중 최대값 구하기
mx_dic = []
for i in dic:
if mx ==dic[i]: # 최빈값의 key저장
mx_dic.append(i)
if len(mx_dic)>1:
return print(mx_dic[1])
else:
return print(mx_dic[0])
'''
최빈값을 어떻게 구하더라...
내가 생각한 로직 :
count() 함수로 각 element의 빈도수를 구할수 있음
1 2 2 3 4
1. list(key=element, value=count)
2. value값으로 오름차순
3. list[1].key값을 출력한다.
'''
dic[value]에서 value는 딕셔너리 dic의 키(key)입니다. 딕셔너리는 키-값(key-value) 쌍을 저장하는 데이터 구조이며, dic[value]는 dic에서 value라는 키에 해당하는 값(value)을 나타냅니다.
** 항상 딕셔너리 구할때 헷갈리는 부분이다.
dic[value]는 현재 value가 딕셔너리 dic의 키로 이미 존재하는 경우 해당 키의 값에 1을 더하고,
없는 경우에는 새로운 키를 생성하고 값을 1로 설정한다. 이를 통해 각 값의 빈도수를 세고, 최빈값을 찾는 로직이다.
'백준 baekjoon' 카테고리의 다른 글
[백준 1929.java] 소수구하기 - 에라토스테네스의 체 (0) | 2024.02.20 |
---|---|
[파이썬-리스트] 사용시 시간초과 방지 방법 (0) | 2024.01.08 |
[백준 11279] 최대힙 (0) | 2024.01.05 |
[백준 1927] 최소힙 / Heap (0) | 2024.01.05 |
[백준 2776] 암기왕 (0) | 2023.06.07 |