Java : 백준(4344) 평균은 넘겠지

김선미·2022년 8월 9일
0

정답 코드

import java.util.Scanner;

public class Main {
    public static void main (String[] args) {
        Scanner scan = new Scanner(System.in);

        int count = scan.nextInt();
        scan.nextLine();
        for (int i =0; i<count; i++) {
            String test = scan.nextLine();
            String[] testarr = test.split(" ");

            int studentcnt = Integer.parseInt(testarr[0]);
            int[] scorearr = new int[studentcnt];
            for (int j=1; j<=studentcnt; j++){
                scorearr[j-1] = Integer.parseInt(testarr[j]);
            }

            int sumscore = 0;
            for (int j=0; j<studentcnt; j++){
                sumscore += scorearr[j];
            }

            int avgscore = sumscore / studentcnt;

            int avgstudent = 0;
            for (int j=0; j<studentcnt; j++){
                if ( scorearr[j] > avgscore) {
                    avgstudent += 1;
                }
            }

            float avgstudentcnt = (float)avgstudent / (float)studentcnt;

            System.out.println(String.format("%.3f%%",avgstudentcnt*100));
        }
        scan.close();
    }
}

다른 정답 코드

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		int[] arr;
		
		int testcase = in.nextInt();
		
		for(int i = 0 ; i < testcase ; i++) {
 
			int N = in.nextInt();	//학생 수 
			arr = new int[N];
			
			double sum = 0;	// 성적 누적 합 변수 
			
			// 성적 입력부분 
			for(int j = 0 ; j < N ; j++) {
				int val = in.nextInt();	// 성적 입력 
				arr[j] = val;
				sum += val;	// 성적 누적 합 
			}
			
			double mean = (sum / N) ;
			double count = 0; // 평균 넘는 학생 수 변수 
			
			// 평균 넘는 학생 비율 찾기 
			for(int j = 0 ; j < N ; j++) {
				if(arr[j] > mean) {
					count++;
				}
			}
			
			System.out.printf("%.3f%%\n",(count/N)*100);
			
	
		}
		in.close();
	}
	
}

차이점

  • 학생 수와 점수를 따로 입력받을 수 있다
  • nextInt로 받은 값을 바로 int array에 넣어도 배열이 입력된다
  • double 자료형 사용

느낀 점

  • 스캐너 사용법을 알고싶지 않아도 알게 되는것 같다..
  • 문제와 입력값을 정확히 파악하기
  • 변수명을 알아보기 쉽게 짓기
  • 어떤 배열 강의보다도 배열을 선언하고 입력하고 추출하는 법을 잘 배울 수 있는 알고리즘이었다.
  • 디버깅을 진행했지만 잘못된 부분을 발견하기 힘들었다.

배운 것

Scanner 입력 문법

int count = scan.nextInt(); //"5"입력
scan.nextLine(); //"Enter" 입력
for (int i =0; i<count; i++) {
    String test = scan.nextLine(); // "5 50 50 70 80 100"
    String[] testarr = test.split(" ");
  • next(); : 해당 문법을 사용 하면 test 변수 안에 5만 들어오고 뒤의 공백을 무시하기 때문에 nextLine(); 문법으로 변경하면 "5 50 50 70 80 100" 가 모두 test 변수 안에 들어온다.
  • nextLine(); : 첫번째 nextInt 입력 후 Enter를 하면 nextLine에 Enter가 입력되어 에러가 나기 때문에 nextLine 처리를 한번 더 해준다.

array 선언 및 입력

String[] testarr = test.split(" ");
  • 문자열로 된 배열을 testarr 이라는 변수명으로 선언한 다음 자바 내장함수 split을 사용하면 공백(" ") 단위로 test 데이터를 나누어 자동으로 배열로 만들어 저장해준다.
  • split 함수 사용시 따로 배열의 길이를 지정하지 않아도 된다.
int studentcnt = Integer.parseInt(testarr[0]);
int[] scorearr = new int[studentcnt];
for (int j=1; j<=studentcnt; j++){
    scorearr[j-1] = Integer.parseInt(testarr[j]);
}
  • 새로운 배열을 선언할때는 길이를 지정해야 한다.
  • 배열 중 [0]번째 인덱스 값만을 studentcnt 라는 변수에 따로 저장할 수 있다.
  • scorearr 의 길이가 4, testarr의 길이가 5일때 testarr에서 [0]번째 인덱스를 제외한 값을 넣기 위해서 j를 1로 지정해준다.
  • 배열 안에 다른 배열의 값을 입력할 때 공통된 index 값인 j를 사용하여 for문으로 하나씩 입력한다.

float 자료형 사용

float avgstudentcnt = (float)avgstudent / (float)studentcnt;

변수를 선언할때 자료형 뿐만 아니라 입력값도 float으로 선언해주어야 한다.

profile
백엔드 개발 공부

0개의 댓글