본문 바로가기
알고리즘/백준

백준 실버4 18110.solved.ac (python)

by 개발하는 호랑이 2024. 2. 14.

solved.ac

 

풀이

풀었는데 계속해서 무슨 문제가 있어서 틀렸습니다. 가 나오는지 몰라서 이것저것 해보다가

2
1
4

를 넣어보니 3이 아닌 2가 나오는 것을 보고, 아... round에서 문제가 생겼구나 싶어서 round함수를 내 입맛에 맞게 바꿔주고 아래처럼 풀었다.

# 어떤 문제의 난이도는 그 문제를 푼 사람들이 제출한 난이도 의견을 바탕으로 결정
# 아직 아무의견이 없다면 문제의 난이도는 0으로 결정
# 의견이 하나 이상 있다면, 문제의 난이도는 모든 사람의 난이도 의견의 30% 절사평균으로 결정

# 절사평균 가장 큰 값과 가장 작은 값들을 제외하고 평균
# 고로 30% 절사 평균은 위에서 15%, 아래에서 15%를 제외하고 평균을 계산
# 제외 해야할 사람이 소수일경우 반올림한다.
# 평균도 소수일 경우 반올림한다.

def half_ceil(n):
    if n%1 >= 0.5:
        return int((n//1) + 1)
    else:
        return int(n//1)

import sys

N = int(sys.stdin.readline())
level_list = []
if N == 0:
    print(0)
else:
    for _ in range(N):
        tmp = int(sys.stdin.readline())
        level_list.append(tmp)

    # level_list의 길이를 구하고, 양옆 제외할 갯수를 구하기.
    # 그리고 level_lsit를 정렬해서 슬라이싱 후, 평균 구하기

    M = len(level_list)
    except_nums = half_ceil(M*0.15)

    f_level_list = sorted(level_list)[except_nums:M-except_nums]

    everage = sum(f_level_list)/(M-(2*except_nums))
    print(half_ceil(everage))

이렇게 하니 해결되었다.

다른 사람 풀이

내 코드보다 훨씬 간결하게 느껴진다.
여기서도 round 문제를 겪었는지 int(n+0.5)로 round를 재정의 함으로 나처럼 0.5에서 올림이 아닌 내림이 되는 문제를 해결했다.
그 외는 근본적 풀이는 나와 동일하다고 봐도 될 듯하다.

import sys


def round(n):
    return int(n + 0.5)


n = int(input())
opinions = [int(sys.stdin.readline()) for _ in range(n)]

if not opinions:
    print(0)
else:
    cut = round(len(opinions) * 0.15)
    array = sorted(opinions)[cut : len(opinions) - cut]

    print(round(sum(array) / len(array)))