본문 바로가기

Coding Test

do it 코딩 테스트: 평균 구하기

Q. N개의 숫자가 공백 없이 써 있다. 이 숫자를 모두 합해 출력하는 프로그램을 작성하시오.

(난이도: 브론즈 II)

    (1) 입력: 1번째 줄에 숫자의 개수 N(1 <= N <= 100), 2번째 줄에 숫자 N개가 공백 없이 주어진다.

    (2) 출력: 입력으로 주어진 숫자 N개의 합을 출력한다

 

 

 

입출력 예시

 

 

 

 

- 문제 분석

그렇다면 이 문제에서 해결해야 할 task 3가지는 무엇일까요? 바로

1. 입력 받은 점수를 1차원 배열에 저장하는 것

2. 배열을 탐색하며 최댓값을 구하는 것

3. 점수변환 후 누적합을 구해 평균을 구하는 것

 

이 세가지가 이 문제에서 해결해야 할 task가 될 것 입니다.

 

 

 

 

해결해야 할 task 3가지

 

 

 

 

-  코드구현

코드 구현 같은 경우 두 가지 방법으로 준비해 와 봤는데요, 1번부터 보여드리도록 하겠습니다. 

 

1. 필자가 풀이한 방법

  저 같은 경우는

(1) 입력을 받는다.

(2) 배열을 공백을 기준으로 쪼갠다

(3) 점수 중 최댓값을 구한다

(4) 점수를 변환함과 동시에 누적합을 구한다

(5) 평균을 출력한다

의 순서로 코드 작성을 하였습니다.

   

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        // 입력을 받기 위한 scanner 객체 생성
        Scanner sc = new Scanner(System.in);

        // 과목 수 입력 받기
        System.out.print("과목 수를 입력하세요: ");
        double s1 = sc.nextDouble();

        // (1) 과목 점수 입력 받기  ex) 13 14 15
        System.out.print("과목들의 점수를 입력하세요: ");
        sc.nextLine();     //버퍼에 담긴 enter 즉 \n을 제외해 주기 위함
        String s2 = sc.nextLine();   // 문자열 "13 14 15"를 받아 s2 변수에 저장
        System.out.println(s1);
        System.out.println(s2);

        //(2) space를 기준으로 문자열을 split해 각각의 요소들을 배열 arr에 담음
        String arr[] = s2.split(" ");
        System.out.println(arr.length);

        //(3) 점수의 최댓값 구하기
        double max=Double.parseDouble(arr[0]);
        for(int i = 1; i < arr.length; i++) {
            double num = Double.parseDouble(arr[i]);
            if (max < num)
                max = num;
        }


        // (4) 문자열의 길이만큼 for문을 순회하며 즉 0부터 (배열길이-1)만큼의 인덱스를 돌며, 각 인덱스에 있는 문자를 가지고 와 점수를 변환하고 누적합을 구함
        int total = 0;
        for(int i = 0; i < arr.length; i++) {
            int num = Integer.parseInt(arr[i]);
            double score = num / max * 100;  //변환된 점수
            total += score;  //변환된 점수를 합산
        }
        //(5) 최종 평균 출력
        System.out.println("결과값은: "+(total/s1));


    }
}

 

출력 화면은 다음과 같습니다.

 

출력결과 1

 

출력결과 2

2. 코드를 줄여서 작성한 방법

이 문제에 점수를 변환하고 총합을 구한 후 평균을 구하는 부분의 수식을 줄이면 코드를 훨씬 적고 깔끔하게 작성할 수 있는데요, 기존에 1번에서는 평균을 구하는 부분을 아래와 같이 구했었습니다.

 

 // (4) 문자열의 길이만큼 for문을 순회하며 즉 0부터 (배열길이-1)만큼의 인덱스를 돌며, 각 인덱스에 있는 문자를 가지고 와 점수를 변환하고 누적합을 구함
        int total = 0;
        for(int i = 0; i < arr.length; i++) {
            int num = Integer.parseInt(arr[i]);
            double score = num / max * 100;  //변환된 점수
            total += score;  //변환된 점수를 합산
        }
        //(5) 최종 평균 출력
        System.out.println("결과값은: "+(total/s1));

 

이를 좀 더 깔끔하게 줄여보면 아래와 같습니다.

//문자열의 길이만큼 for문을 순회하며 즉 0부터 (배열길이-1)만큼의 인덱스를 돌며, 인덱스에 있는 문자를 가지고 점수를 변환하고 누적합을 구함
        int total = 0;
        for(int i = 0; i < arr.length; i++)
            total += Integer.parseInt(arr[i]);  //변환된 점수를 합산

        //최종 평균 출력
        System.out.println("결과값은: "+(total*100/max/s1));

이랗게 for문으로는 총합만 구하고, 뒤에 println 함수 안에서의 식으로 한 번에 점수를 변환시키고 평균을 구하는 것이죠. 그럼 어떻게 이러한 수식이 가능한지 한 번 살펴볼까요?

점수변환&평균 수식

위 수식에서 A,B,C를 모두 점수라고 하였을 때, 기존에 우리는 A/M*100을 통해 점수를 변환한 후 이를 모두 합산에 3으로 나누어 평균을 구했습니다. 이러한 수식은 등식의 오른쪽 부분과 같이도 나타낼 수 있는데, 코드상으로 총합을 먼저 구한 뒤에 나머지 변환과 평균 연산을 해 주면 훨씬 깔끔해지겠죠?

 

 

출력 결과를 보시면

출력 결과 1
출력결과 2

 

잘 나오죠? 오늘 코딩테스트 마무리 하겠습니다 :)

 

'Coding Test' 카테고리의 다른 글

Do it 코딩 테스트: 구간 합 구하기  (0) 2023.09.14
do it 코딩 테스트: 숫자의 합 구하기  (0) 2023.09.08