성장일기

내가 보려고 정리하는 공부기록

코딩테스트/백준 브론즈,실버

[백준] 1546 : 평균 (스트림 실수형 매핑 _ mapToDouble()) - JAVA

와나나나 2024. 1. 14. 01:35
728x90

백준 단계별 문제풀이 4단계 (1차원 배열)

https://www.acmicpc.net/problem/1546

 

1546번: 평균

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

www.acmicpc.net

 

# 문제

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

 

# 예제

입력 - 첫쨰줄에는 과목개수 N ( N <= 1000 ), 둘쨰줄에는 현재성적 주어짐

3
40 80 60

 

출력

75.0

 

 

# 필요개념

최대값을 받은 후, 스트림을 이용해 ‘i / max * 100’ 이라는 조건에 맞춰 값을 매핑해주었다. 이때, int로 하면 나누었을 때 원하는 값이 나오지 않을 수도 있으므로 mapToDouble() 메소드를 이용해 double타입으로 매핑해주었다!

 

mapToDouble은 출력값의 형태를 double형으로 바꾸는 역할을 한다! 

나누기 연산을 사용할 떄에는 int형으로 진행하면 소수자리를 버림하기 때문에 원하는 답과 다르게 나올 수 있다! 안전하게 실수형을 사용하는 것이 좋다.  

 

# Code

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int size = sc.nextInt();
        int[] arr = new int[size];

        for (int i = 0 ; i < size ; i++) {
            arr[i] = sc.nextInt();
        }
        int max = Arrays.stream(arr).max().getAsInt();
        double sum = Arrays.stream(arr).mapToDouble(i -> (double) i / max * 100).sum();
        double avg = (double) sum / size;
        System.out.println(avg);
    }
}

 

# 결과