https://www.acmicpc.net/problem/1546
문제
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
출력
첫째 줄에 새로운 평균을 출력한다. 정답과의 절대/상대 오차는 10-2까지 허용한다.
풀이
1. 시험 본 과목의 갯수, 현재 성적을 입력받는다.
=> 처음에는 Scanner 함수를 이용하여 입력을 받았는데, 검색해보니 BufferedReader를 이용하면 훨씬 속도가 빠르다고 한다(버퍼 사이즈 때문. 관련 내용 정리해서 올려야지)
2. 입력받은 점수 중 최댓값을 고른다.
=> 나는 for문을 사용하여 index 0번을 max 값으로 넣은 후 n-1번까지 비교해가며 비교대상의 값이 더 큰 경우 max 값을 바꿔주는 식으로 구현하였다. 검색하다가 Arrays.sort(arr) 함수를 쓴 풀이를 봤다. 정렬 하면 최대값이나 최소값 구하기는 쉬운데 모든 값을 비교하며 진행하니 속도가 더 느리다고 한다. (근데 채점해보니 속도 차이 없음..? 아니 더 느려졌다..?)
3. 모든 점수를 점수/M*100 으로 고친다
=> 점수는 변하지만 M*100 부분은 모든 값에 공통적으로 적용되기 때문에 for문을 사용하여 배열에 입력받은 점수 값을 넣으면서 배열의 모든 수를 더한 후 / max * 100을 했다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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());
String[] input = br.readLine().split(" ");
double[] arr = new double[n];
double sum = 0;
double max = 0;
for(int i=0; i<n; i++) {
arr[i] = Double.parseDouble(input[i]);
sum += arr[i];
if(max < arr[i]) {
max = arr[i];
}
}
System.out.println(sum / max * 100 / n);
}
}