1-3 [배열과 리스트 실전 문제] 평균 구하기 (백준 1546)

그린·2023년 3월 2일
0

1) 문제 분석하기

최고 점수를 기준으로 전체 점수를 다시 계산해야 하므로 모든 점수를 입력받은 후에 최고점을 별도로 저장해야 한다. 또한 문제에서 제시한 한 과목의 점수를 계산하는 식은 총합과 관련된 식으로 변환할 수 있다.

따라서 일일이 변환 점수를 구할 필요 없이 한번에 변환한 점수의 평균 점수를 구할 수 있다.

(A/M*100 + B/M*100 + C/M*100) / 3 
= (M*100)(A+B+C) / 3
= (A+B+C) * 100 / M / 3

2) 손으로 풀어 보기

  1. 점수를 1차원 배열에 저장
  2. 배열을 탐색하며 최고 점수와 점수의 총합을 구함
  3. 총합 * 100 / 최고 점수 / 과목 수 를 계산함

3) 슈도코드 작성하기

변수 N에 과목 수 입력 받기
길이가 N1차원 배열 A[] 선언하기
for -> A[i]에 각 점수 저장
for -> 최고점은 max, 총점은 sum에 저장
sum * 100 / max / N 출력

4) 실제 코드 작성하기

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

public class Main2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        double[] score = new double[n];
        StringTokenizer st = new StringTokenizer(br.readLine());
        double max_score = 0;
//        for (int i = 0; i < n; i++) {
//            score[i] = Integer.parseInt(st.nextToken());
//            if (score[i] > max_score) {
//                max_score = score[i];
//            }
//        }
//
//        double sum = 0;
//        for (int i = 0; i < n; i++) {
//            score[i] = ((double) score[i] / max_score) * 100;
//            sum += score[i];
//        }
//
//        double average = (double) sum / n;
//        System.out.println(average);


        // 강의에서 나온 코드 참고해서 효율적으로 수정
        long sum = 0;
        for (int i = 0; i < n; i++) {
            score[i] = Integer.parseInt(st.nextToken());
            if (score[i] > max_score) {
                max_score = score[i];
            }
            sum += score[i];
        }

        // 더 효율적으로 하면 (배열 생성 x)
//        for (int i = 0; i < n; i++) {
//            int temp = Integer.parseInt(st.nextToken());
//            if (temp > max_score) {
//                max_score = temp;
//            }
//            sum += temp;
//        }

        System.out.println(sum * 100.0 / max_score / n); // 100.0으로 하면 알아서 double 형으로 됨
    }
}
profile
기록하자

0개의 댓글