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

https://www.acmicpc.net/problem/18110
문제 이해
입력: 평가한 사람 수 n과 n개의 점수
조건: 상위 15%, 하위 15%를 잘라내고 중앙 부분의 평균을 계산
출력: 소수점 첫째 자리에서 반올림한 정수
문제 풀이 핵심
점수를 배열에 입력받고 오름차순으로 정렬한다.
n에 0.15를 곱해 잘라낼 개수 cut을 구한다.
cut 만큼 앞과 뒤에서 각각 잘라낸다.
남은 값들의 평균을 구하고, 반올림해 출력한다.
전체 코드
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.Round를 MidpointRounding.AwayFromZero 옵션과 함께 사용했다.
문제 풀이 후 느낀 점
절사평균 개념을 이해하는 게 가장 중요했다.
LINQ 메서드 Skip과 Take를 활용해 배열의 일부 구간을 쉽게 처리할 수 있었다.
예외처리로 남은 배열의 길이가 0 이하가 되는 경우를 꼭 고려해야 했다.
반올림 옵션을 제대로 쓰지 않으면 값이 틀릴 수 있으니 주의해야 한다.
마무리
처음엔 Skip과 Take를 어떻게 조합해야 할지 헷갈렸지만,
문제를 여러 번 읽고 예시도 직접 계산해 보면서 이해할 수 있었다.