백준 4344

2018-11-11

백준 4344번 : 평균은 넘겠지

img

정답

package baekjoon;
import java.util.Scanner;
public class Problem4344 {
    // 점수의 갯수
    static int total;
    // 점수의 합
    static int totalScore;
    
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int num = Integer.parseInt(s.nextLine());
        // 첫번째 입력만큼 for문 돌려주기. 
        for(int i=0; i<num; i++) {
            /* total : 점수의 갯수 
             * totalScore : 점수의 합  
             * for문 끝날때마다 0으로 다시 초기화 해주어야한다.
             */
            total = 0; totalScore = 0;
            String str = s.nextLine();
            calAverage(str);
        }    
    }
    // 평군구하는 함수
    static private void calAverage(String str) {
        
        //3 10 20 30 을 " " 공백으로 split해서 배열로 담기 .
        String[] strArray = str.split(" ");
        int num = 0;
        // 총 검사할 인원은 항상 0번째 배열에담겨있다.
        // parseInt 함수를 써서 String -> Int로 변환 작업
        total += Integer.parseInt(strArray[0]);
        
        /* split한 배열중 0번째는 총 인원수.
         * 1번째부터 마지막 배열은 점수의 관한 배열이므로 
         * 하나하나씩 더해준다.
         */
        for(int i=1; i<strArray.length; i++) {
            totalScore += Integer.parseInt(strArray[i]);
        }
        /* totalScore/total 는 그 줄의 관한 평균 
         * 만약 1~마지막배열 까지 평균과 비교해서 그 평균을 넘으면 
         * num 변수를 ++ 해준다.
         */
        for(int i=1; i<strArray.length; i++) {
            if(Integer.parseInt(strArray[i]) > totalScore/total) {
                num++;
            }
        }
        /* 평균이넘은 점수의 갯수 / 배열의길이 -1 (첫번째배열은몇개 입력할것인지 이기때문에.)
         *  * 100 으로 출력해주면 된다. 
         */
        System.out.printf("%.3f%% \n",(double)num / ((double)strArray.length-1)* 100);
    }
}

이번에 짠 소스코드는 정답 지향적으로 작성해서

최적화된 알고리즘이 아니다.

static 변수를 선언한 것도 그렇고, String을 Integer로 변환해주는 작업때문에

다른 알고리즘 보다는 시간이 걸리는 알고리즘이 되었다.

독자분들이 리펙토링 하는것도 좋겠다.