코딩 테스트 [자료구조] - 평균 구하기

유의선·2023년 1월 5일
0

세준이는 기말고사를 망쳤다. 그래서 점수를 조작해 집에 가져가기로 결심했다. 일단 세준이는 자기 점수 중 최댓값을 골랐다. 그런 다음 최댓값을 M이라 할 때 모든 점수를 점수 / M*100으로 고쳤다. 예를 들어 세준이의 최고점이 70점, 수학 점수가 50점이라면 수학 점수는 50 / 70*100이므로 71.43점이다. 세준이의 성적을 이 방법으로 계산했을 때 새로운 평균을 구하는 프로그램을 작성하시오.


입력

1번째 줄에 시험을 본 과목의 개수 N이 주어진다. 해당 값은 1,000보다 작거나 같다. 2번째 줄에 세준이의 현재 성적이 주어진다. 해당 값은 100보다 작거나 같은, 음이 아닌 정수이고, 적어도 1개의 값은 0보다 크다.

출력

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

예제 입력
3
40 80 60

예제 출력
75.0

1단계 문제 분석하기
최고 점수를 기준으로 전체 점수를 다시 계산해야 하므로 모든 점수를 입력받은 후에 최고점을 별도로 저장해야 한다.
또한 문제에서 제시한 한 과목의 점수를 계산하는 식은 총합과 관련된 식으로 변환할 수 있다.
따라서 일일이 변환 점수를 구할 필요 없이 한번에 변환한 점수의 평균 점수를 구할 수 있다.

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

2단계 손으로 풀어보기

1 점수를 1차원 배열에 저장한다

index =  1    2    3    4    5
int[] = '1', '2', '4', '8', '16'
         ---------------------->

2 배열을 탐색하며 최고 점수와 점수의 총합을 구한다.

최고 점수 = 16, 총합 = 31

3 '총합 * 100 / 최고 점수 / 과목의 수'를 계산해 다시 계산한 점수의 평균값을 출력한다.

총합 * 100 / 촤고 점수 / 과목의 수 = 31 * 100 / 16 / 5 = 38.75

3단계 sudo코드 작성하기

변수 N에 과목의 수 입력받기
길이가 N인 1차원 배열 A[] 선언하기
for(A[] 길이만큼 반복하기) {
	A[i]에 가 점수 저장하기
}
for(A[] 길이만큼 반복하기) {
	최고점은 변수 max에, 총점은 변수 sum에 저장하기
}
sum * 100 / max / N 출력하기

4단계 코드 구현하기

import java.util.Scanner;

public class Q2 {
    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(A[i] > max)
                max = A[i];
            sum += A[i];
        }

        System.out.println(sum * 100.0 / max / N);
    }
}

  • Do it! 알고리즘 코딩테스트 자바 편

0개의 댓글