평균 - 1546번 (Java 풀이)
문제
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
출력
첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.
예제 입력 1
3
40 80 60
예제 출력 1
75.0
예제 입력 2
3
10 20 30
예제 출력 2
66.666667
10-2 이하의 오차를 허용한다는 말은 정확히 소수 2번째 자리까지 출력하라는 뜻이 아니다.
예제 입력 3
4
1 100 100 100
예제 출력 3
75.25
예제 입력 4
5
1 2 4 8 16
예제 출력 4
38.75
예제 입력 5
2
3 10
예제 출력 5
65.0
예제 입력 6
4
10 20 0 100
예제 출력 6
32.5
예제 입력 7
1
50
예제 출력 7
100.0
예제 입력 8
9
10 20 30 40 50 60 70 80 90
예제 출력 8
55.55555555555556
이 문제를 처음 본 순간 풀이의 핵심은 최댓값을 구하는 방법이라고 생각되었고, 이 방법으로 가장 기본적인 for문을 이용하여 배열을 순회하고, 각 배열의 value 값을 비교하여 최댓값을 구하는 방법으로 구현하였다. 아래 코드로 백준문제와 값자체는 같게 나오지만 32.5가 32.5000000 이런식으로 출력되어 틀렸다고 나오는 문제를 해결하기 위해 출력형태를 이것저것 바꿔봤지만 예제출력들의 소수점출력이 모두 제각각이라 소용없었고, python의 자동출력형태로 문제가 출제된 것 같았다.
그래서 인터넷에 서칭해봤는데 나와 똑같은 출력값이 나오는 사람의 코드가 맞았다고 뜨는데 뭐가 문제인지 정확히 모르겠다... (최댓값 구할때 예외처리 하나뺴먹었었음 -> 배열값들끼리 큰걸 maxNum에 넣는게 아니라 maxNum=0과 비교해서 더 클때마다 넣어주는 식으로 로직을 바꾸니까 예외처리할 필요 없이 해결됨)
package BAEKJOON_1546;
import java.util.*;
/*
날짜 : 2024.07.13.토
내용 : 백준 10811번 문제
*/
public class BAEKJOON_1546 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 점수를 입력받을 시험과목수를 지정할 변수n 세팅
double[] arr = new double[n+1]; // 시험 본 과목의 수만큼의 크기를 같는 배열선언
double maxNum = 0; // 과목들중 점수가 가장 높은 점수 저장할 변수 maxNum 선언
double newGrade = 0; // 새롭게 산출한 점수 저장한 변수 선언
double newGradeTotal = 0; // 새롭게 산출한 점수의 총점을 선언
for(int i = 0; i<n; i++) {
arr[i] = sc.nextInt(); // num 이라는 변수로 시험점수를 입력받기
}
for(int i = 0; i<n; i++) {
if(arr[i] >= maxNum) {
maxNum = arr[i]; // 새로 입력한 값이 더 클때 최댓값으로 변경, 처음에 인덱스 0과1 비교
}
}
for (int i=0; i<n; i++) { // 각 과목의 점수를 새롭게 산출
arr[i] = arr[i]/maxNum*100;
newGradeTotal += arr[i];
}
System.out.println(newGradeTotal/n);
}
}