Java) 백준 1546 _ 평균

Dev.Shinny·2022년 5월 26일
0

알고리즘

목록 보기
2/3

평균

문제

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M100으로 고쳤다.예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70100이 되어 71.43점이 된다.세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

출력

첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.


문제분석

최고 점수를 기준으로 전체 점수를 다시 계산해야하기 때문에 모든 점수를 입력받은 후에 최고점을 구해 별도로 저장해야 합니다.

(국어/M100+수학/M100+영어/M100)/3 = (국어+수학+영어)/M100/3

점수를 입력받아 일일이 변환을 해도 되지만, 효율적인 코드를 위해 한 번에 변환한 점수의 평균을 구하도록 해야합니다.

*알고리즘 문제를 해결할 때 손으로 풀어보는 과정이 필요한 이유 같습니다. 쉬운 문제라 하더라도 바로 코딩을 해버리면 저런 부분을 놓치게 되더라고요.

슈도코드

Scanner 클래스
변수 N에 과목수 입력받기
길이가 N인 배열 A[] 선언하기 

for(N의 크기만큼){
	A[i]에 점수 입력받기}
    
총합을 저장할 변수 sum 초기화 선언
최고 점수를 저장할 변수 max 초기화 선언

for(N의 크기만큼){
	if문으로 최고점수 구해서 max에 저장
    모든 점수의 총합을 sum에 저장
}
sum/max*100/N 출력하기 

실전 코드

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(max<A[i]) max = A[i];
        sum+=A[i];
       }
       System.out.println(sum*100.0/max/N);        
    }
}

sum 100.0/max/N 과 sum/max 100.0/N은 수학적으로 차이가 없는데, 백준에서 전자는 맞았다하고 후자는 틀렸다는 결과가 나옵니다.

아무래도 앞서 변수를 정수형으로 선언했기 때문에 sum/max 연산이 실행되면 소수점을 결과를 버리게됩니다. 이 부분에서 결과값이 달라질 수 있어 후자는 틀린 결과가 나오는 것 같습니다. 이런 기본적인 부분이 헷갈리다니 아직도 반복학습이 필요한 것 같습니다.

profile
Hello I'm Shinny. A developer who try to enjoy the challenge.

0개의 댓글