https://www.acmicpc.net/problem/2108
문제 풀이
# BOJ_2108
import math
# 수 입력
n = int(input())
nums = []
for i in range(n):
nums.append(int(input()))
# 1. 산술평균 구하기
sum = 0
for num in nums:
sum += num
print(round(sum / n))
# 2. 중앙값 구하기
nums.sort() # 오름차순으로 정렬
index = math.floor(n / 2)
print(nums[index])
# 3. 최빈값 구하기
count_dic = {}
for num in nums:
if num in count_dic:
count_dic[num] += 1
else:
count_dic[num] = 1
# count_dic value 값을 기준으로 내림차순 정렬 후 리스트로 만들기
count_list = sorted(count_dic.items(), key=lambda x: x[1], reverse=True)
# print(count_list)
if len(count_list) == 1:
print(count_list[0][0])
else:
if count_list[0][1] == count_list[1][1]: # 같으면 두번째 수 출력
print(count_list[1][0])
else: # 첫번째 수 출력
print(count_list[0][0])
# 4. 범위
print(max(nums) - min(nums))
눈여겨 볼 부분은
1. 중앙값의 인덱스
2. 최빈값의 딕셔너리를 정렬한 후 튜플 값을 통해 두번째 작은 수를 구하는 과정
1. 중앙값의 인덱스는 round(n/2)로 하였으나
예시
7 1 1 2 2 3 3 4 |
결과
2 2 2 3 |
결과에서 2323이 나오는 바람에 원인을 찾게 되었다.
인덱스는 0부터 시작하므로
반올림이 아니라 내림으로 해야 정확히 7의 중간값인 4 > 인덱스로는 3으로 가게 된다.
즉 7/ 2 = 3.5 > 내림으로 3으로 인덱스를 만들어 주어야 한다.
import math > index = math.floor(n / 2) 이용할 것
2. 최빈값의 딕셔너리를 정렬한 후 튜플 값을 통해 두번째 작은 수를 구하는 과정
count_dic value 값을 기준으로 내림차순 정렬 후 리스트로 만들기
[(1, 2), (2, 2), (3, 2), (4, 1)]
해당 리스트에서
튜플 안에 첫번째 값은 입력된 수를 의미하고, 두번째 값은 입력된 수가 몇 번 나왔는지 빈도수를 의미한다.
따라서 빈도수를 기준으로 내림차순 정렬한 후에
맨 앞과 맨 뒤의 빈도수가 같으면 두번째 입력된 수 2를 출력하도록 한다.
맨 앞과 맨 뒤의 빈도수가 다르면 바로 첫번째 입력된 수 1을 출력하도록 한다.
위 리스트에서는 빈도수가 같으므로 두번째 입력된 수 2를 출력하도록 한다.
'Computer Science > Algorithm' 카테고리의 다른 글
[백준] 1181번 단어정렬 - 시간초과 (0) | 2023.01.09 |
---|---|
[백준] 10828번 스택 구현 - 시간초과문제 (0) | 2023.01.08 |
[백준] 1929번 소수 구하기, 실버3, python (0) | 2023.01.07 |
[백준] 1018번 체스판 다시 칠하기, python (0) | 2023.01.07 |
[백준] 1920번 수 찾기, python (0) | 2023.01.06 |