Dev Hyeri

◖코딩 테스트◗▬▬▬▬▬▬▬▬▬/백준

[백준] ✔️1546 평균 (설명/코드/정답)

_hyeri 2024. 8. 12. 23:28

 

문제 링크 : https://www.acmicpc.net/problem/1546

 

 

 

 

1. 요구 사항 이해

시간, 메모리 제한 : 2초 / 128 MB

 

점수 중 최댓값 M을 기준으로 모든 점수를 점수/M*100으로 변환한다.

변환된 점수들의 새로운 평균을 계산한다.

입력 첫 줄: 시험 본 과목의 개수 N (N ≤ 1000)

입력 둘째 줄: 세준이의 현재 성적 (각각 0 ≤ 점수 ≤ 100)

변환된 점수들의 새로운 평균을 소수점 둘째 자리까지 출력한다.



 

 

 

2. 설계/검증 

 

복잡도

시간 복잡도  최악의 경우  공간 복잡도
O(N)   O(N)

 

최댓값을 찾기 위해 배열을 한 번 순회 O(N), 점수를 조작하고 합을 계산하기 위해 배열을 한 번 더 순회 O(N).

시간 복잡도는 O(N)

 

scores 배열을 사용하므로 공간 복잡도는 O(N)  



 

 

 

3. 정상 코드

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        int N = scan.nextInt(); // 시험 본 과목의 개수
        //유효성 검사
        if (N > 1000) {
            System.out.println("시험 본 과목의 개수는 1000보다 작거나 같다");
            return;
        }

        // 성적을 저장할 배열 선언과 초기화
        int[] scores = new int[N];
        int max = 0; // 최고점
        for (int i = 0; i < N; i++) {

            scores[i] = scan.nextInt();
            // 유효성 검사
            if (scores[i] > 100 || scores[i] < 0) {
                System.out.println("100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다");
                return;
            }

            if (scores[i] > max) {
                max = scores[i];
            }
        }

        // 성적 조작
        double total = 0.0;
        for (int score : scores) {
            total += (double) score / max * 100;
        }

        // 결과 출력
        System.out.println(total / N);

        scan.close();
    }
}

 

 

 

 

 

 

추가 정리

타입형 주의 

나누기 100이 소수점이 있는 실수를 만들기 때문에 실수 타입형을 사용한다. 

 

 


오차 범위 

절대오차 또는 상대오차가 10^-2 이하라는 조건은 일반적으로 소수점 두 자리까지의 정확도를 요구하지만, 코드에서 출력하는 수가 문제의 허용 오차 범위 내에 있으면 정확하다고 판단됩니다. 즉, 소수점 아래 두 자릿수까지 맞추는 것이 아니라, 계산 결과가 0.01 단위 이하로 정확해야 합니다. 이를 수학적으로 증명하면, 출력의 정확도가 수치상으로 요구되는 오차 범위 내에 있는지 확인하면 됩니다.