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

[BAEKJOON]18110 solved.ac

by 응애~ 개발자 2024. 1. 11.
728x90
반응형

문제 요약

  • 알고리즘 분류:  구현, 시뮬레이션
  • 난이도: Silver4
  • 문제내용:
    • 절사평균 30프로 기준(위, 아래 15프로) 평균 값을 구하여라
  • 사이트: https://www.acmicpc.net/problem/18110
 

18110번: solved.ac

5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.

www.acmicpc.net

문제풀이

 이번 문제는 간단하게 정렬한 다음 전체 크기에서 15프로 구한 다음 위 아래 15 프로 제외하고 평균 값을 구하면 된다. 자바는 그대로 구현 하면 되지만 파이썬은 그대로 구현 하면 틀리기 때문에 아래 코드에서 자세 하게 다루겠다.

Code

Python

 round 대신 int(N * 0.15 + 0.5) 으로 대체 했다. python에서 round처리가 가능하지만 round함수는 부동소수점 연산 처리하기 때문에 오사오입 반올림으로 처리가 된다. 실제 연산 결과를 보면 3.5 반올림 하면 4로 정상적으로 나오지만 4.5 round 함수 사용하면 5가 아닌 4로 나온다. 그래서 python에서는 round 대신 아래 같은 방식으로 처리 해야 한다.

 int(소수 or 문자열)은 정수 내림으로 반환한다. 그럼 0.5 연산후 내림 처리하면 반올림 연산이랑 같다. 

array[trimmedNum: N - trimmedNum] index slicing 기법으로 [시작 위치: 종료 위치]로 표현 해서 리스트의 사이의 값들을 리스트로 반환 한다.

 

import sys
input = sys.stdin.readline

N = int(input())

if N:
    trimmedNum = int(N * 0.15 + 0.5) # 절사 평균 기준 값
    array = sorted([int(input()) for _ in range(N)])
    print(int(sum(array[trimmedNum: N - trimmedNum]) / (N - trimmedNum * 2) + 0.5))
else:
    print(0)

 

Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int N = Integer.parseInt(br.readLine());

		int trimmedNum = (int) Math.round((float) N * 0.15); // 절사 평균 기준 값

		int[] solved = new int[N];

		for(int i = 0; i < N; i ++){
			solved[i] = Integer.parseInt(br.readLine());
		}

		Arrays.sort(solved);

		float sum = 0;

		for(int i = trimmedNum; i < N - trimmedNum; i ++){
			sum += solved[i];
		}

		System.out.println( Math.round(sum / (float) (N - trimmedNum * 2) ));

	}

}

 

728x90
반응형