본문 바로가기
CODING TEST/BOJ

[Java] 문제 002(백준 1546번)

by 정성인(人) 2024. 2. 14.

문제


평균 구하기(Baekjoon: 1546번)

 

 

풀이


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