본문 바로가기

Programming/알고리즘

[백준] 1546 - 평균 - JAVA[자바]

 

문제의 조건 중 눈여겨 봐야할 것은

 

"실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다." 는 것이다.

 

 

처음 제출했을때 틀린코드는 아래와 같다.

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

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[] arr = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int max = arr[0];
        int sum = 0;
        
        for(int i = 0; i < N; i++){
            if(max< arr[i]){
                max = arr[i];
            }
            sum += arr[i];
        }
        double norm =  (100 * sum) / (N * max);
        System.out.print(norm);
    }

}

 

이는 변수에 대한 이해가 부족해서  였다.

 

변수의 메모리 크기는 아래와 같은데, 

byte < char, short < int < float < long < double

 

연산에서 상대적으로 메모리가 큰 데이터 타입으로 형변환 되어서 연산 된다.

즉, int + double 연산이라면 int가 double로 변환되고 결과값도 double이 된다.

 

 

 

에러가 발생한 부분은

double norm =  (100 * sum) / (N * max);

바로 위의 부분이다.

 

norm을 double로 선언해도 (100 * sum) / (N * max)에서

sum, N, max모두 int  ->  즉, 정수끼리의 연산이기에 "이미 오차를 발생 시킨 후에 double로 변환 시킨 것"이다.

 

그래서, sum, N, max중 아무것이나 하나 double로 선언해주면 (100 * sum) / (N * max) 안에 있는

변수 sum, N, max 이 모두 double로 바뀐 후에 연산되어 오차가 발생하지 않는다.

 

본인의 경우에는 

int sum = 0; => double sum=0;으로 바꿔주었다.

 

 

 

완성된 코드


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

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[] arr = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int max = arr[0];
        double sum = 0;
        
        for(int i = 0; i < N; i++){
            if(max< arr[i]){
                max = arr[i];
            }
            sum += arr[i];
        }
        double norm =  (100 * sum) / (N * max);
        System.out.print(norm);
    }

}