백준 18110 - 절사평균 (Trimmed Mean) (C#)

김보근·2025년 7월 17일

백준

목록 보기
44/62

백준 18110 - 절사평균 (Trimmed Mean) (C#)

오늘은 백준 18110번 절사평균 문제를 풀어봤다.
이 문제는 여러 사람이 난이도 평가를 했을 때,
상위 15%, 하위 15%를 제외한 나머지 평가의 평균을 구하는 문제이다.


https://www.acmicpc.net/problem/18110

문제 이해

  • 입력: 평가한 사람 수 n과 n개의 점수

  • 조건: 상위 15%, 하위 15%를 잘라내고 중앙 부분의 평균을 계산

  • 출력: 소수점 첫째 자리에서 반올림한 정수

문제 풀이 핵심

  1. 점수를 배열에 입력받고 오름차순으로 정렬한다.

  2. n에 0.15를 곱해 잘라낼 개수 cut을 구한다.

    • 소수점은 반올림한다.
  3. cut 만큼 앞과 뒤에서 각각 잘라낸다.

  4. 남은 값들의 평균을 구하고, 반올림해 출력한다.

전체 코드

using System;
using System.Collections.Generic;
using System.Text;

namespace backjoon
{
    internal class Program
    {
        static void Main()
        {

            int input = int.Parse(Console.ReadLine());
            int[] scores = new int[input];

            for (int i = 0; i < input; i++)
            {
                scores[i] = int.Parse(Console.ReadLine());
            }

            Array.Sort(scores);

            int cut = (int)Math.Round(input * 0.15, MidpointRounding.AwayFromZero);

            int trimmedLength = input - 2 * cut;
            if (trimmedLength <= 0)
            {
                Console.WriteLine(0);
                return;
            }

            var trimmed = scores.Skip(cut).Take(trimmedLength);

            double average = trimmed.Average();

            Console.WriteLine((int)Math.Round(average, MidpointRounding.AwayFromZero));
        }
    }
}

코드 포인트

int cut = (int)Math.Round(input * 0.15, MidpointRounding.AwayFromZero);
int trimmedLength = input - 2 * cut;

if(trimmedLength <= 0)
{
    Console.WriteLine(0);
    return;
}

var trimmed = scores.Skip(cut).Take(trimmedLength);
double average = trimmed.Average();
Console.WriteLine((int)Math.Round(average, MidpointRounding.AwayFromZero));
  • cut : 앞뒤로 잘라낼 개수를 정하는 변수

  • Skip(cut) : 앞에서 cut개를 제외

  • Take(trimmedLength) : 남은 배열 중 필요한 개수만큼 가져오기

  • Average() : 평균 계산

  • 반올림은 Math.RoundMidpointRounding.AwayFromZero 옵션과 함께 사용했다.

문제 풀이 후 느낀 점

  • 절사평균 개념을 이해하는 게 가장 중요했다.

  • LINQ 메서드 SkipTake를 활용해 배열의 일부 구간을 쉽게 처리할 수 있었다.

  • 예외처리로 남은 배열의 길이가 0 이하가 되는 경우를 꼭 고려해야 했다.

  • 반올림 옵션을 제대로 쓰지 않으면 값이 틀릴 수 있으니 주의해야 한다.

마무리

처음엔 SkipTake를 어떻게 조합해야 할지 헷갈렸지만,
문제를 여러 번 읽고 예시도 직접 계산해 보면서 이해할 수 있었다.

profile
게임개발자꿈나무

0개의 댓글