문제
풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 시험 본 과목 개수 입력받기
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 각 과목의 시험 성적 입력받기
int a[] = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
// 각 과목의 합과, 최고 점수 구하기
long sum = 0;
long max = 0;
for (int i = 0; i < n; i++) {
if (a[i] > max)
max = a[i];
sum = sum + a[i];
}
// 문제 조건대로 변형한 후의 평균 점수 출력하기
System.out.println(sum * 100.0 / max / n);
}
}
설명
개요
최고 점수를 기준으로 각 점수를 다시 계산해야 한다.
따라서 점수를 입력 받으면서, 최고 점수도 구해야 한다.
그 후, 문제 조건에 맞게 모든 점수를 "/ 최고점수 * 100"로 변환해서
평균을 구해야 한다.
"sum * 100.0 / max / n"의 의미
과목 A, B, C 각각을 "* 100.0 / max" 계산 후 평균을 구하면,
(A / max * 100.0 + B / max * 100.0 + C / max * 100.0) / 3이다.
이는 수학시간 때 배운 분배법칙에 따라,
(A + B + C) * 100.0 /max / 3이 된다.
여기서, "(A + B + C)"가 변수 sum,"3"이 변수 n에 해당된다.
자동 형 변환
이 때, 왜 100이 아니라, 굳이 100.0을 곱할까?
왜냐하면 변수 sum, max, n은 전부 정수형이다.
정수형끼리 곱하고 빼도 갈과는 정수형이 된다.
5 / 3을 해도 결과는 1이 나온다는 것이다.
정수형에 실수형으로 곱하고 빼야지 원하는 소수가 나온다.
이유는 자동 형 변환(type conversion)이 되기 때문이다.
자동 형 변환이란, 덜 정밀한 수(byte 단위 작은 수)와 더 정밀한 수(byte 단위 큰 수)가 연산될 때 일어난다.
예로 정수형 int는 4byte이지만, double형(100.0)은 8byte이므로,
5 / 3.0 연산에서, 5는 5.0으로 자동 형 변환이 일어나고,
그 결과 값은 1.6666666666666667이 나온다.
물론 long형은 8byte로, double형과 크기가 같다.
그러나 이 때는, byte 크기로 이해하지 말고, 어떤 게 더 정밀한지 아닌지로 이해하자.
long형은 정수형, double형은 실수형이고, 실수가 정수보다 더 정밀하니까(소수점까지 표현하니까),
long형이 double형으로 자동 형 변환된다고 이해하면 될 것이다.
'CODING TEST > BOJ' 카테고리의 다른 글
[Java] 문제 006(백준 2018번) (0) | 2024.05.24 |
---|---|
[Java] 문제 005(백준 10986번) (0) | 2024.02.14 |
[Java] 문제 004(백준 11660번) (0) | 2024.02.14 |
[Java] 문제 003(백준 11659번) (0) | 2024.02.14 |
[Java] 문제 001(백준: 11720번) (0) | 2024.02.14 |