본문 바로가기
코딩테스트

[Java] 배열+반복문으로 각 학생의 총점, 평균 계산

by 우지uz 2023. 12. 20.

김영한님의 자바입문 강의 안에 있는 예제를 스스로 풀어본 것입니다.

첫번째 잘못된 풀이와 이유

package array.ex;
import java.util.Scanner;


public class ArrayEx7 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int[][] students = new int[4][3];
        String[] subjects = {"국어", "영어", "수학"};
        int sum = 0;

        for (int row = 0; row < students.length; row++){
            System.out.println(row+1 + "번 학생의 성적을 입력하세요!");
            for (int column = 0; column < students[row].length; column++){
                System.out.print(subjects[column] + "점수 :" );
                students[row][column] = input.nextInt();
                sum += students[row][column];
            }
            double average = (double) sum / students[row].length;
            System.out.println(row+1 + "번 학생의 총점 : " + sum + ", 평균 : " + average);
        }
    }
}
# 출력 결과
1번 학생의 성적을 입력하세요 :
국어점수 :50
영어점수 :60
수학점수 :70
1번 학생의 총점 : 180, 평균 : 60.0
2번 학생의 성적을 입력하세요 :
국어점수 :30
영어점수 :90
수학점수 :89
2번 학생의 총점 : 389, 평균 : 129.66666666666666
3번 학생의 성적을 입력하세요 :
국어점수 :35
영어점수 :75
수학점수 :60
3번 학생의 총점 : 559, 평균 : 186.33333333333334
4번 학생의 성적을 입력하세요 :
국어점수 :30
영어점수 :60
수학점수 :50
4번 학생의 총점 : 699, 평균 : 233.0

문제점1) 총점과 평균이, 학생마다 따로 계산해야 하는데 
전역변수로 선언 되어서 그런지 , 전체 학생의 점수를 더하고 있었다. 

문제점2) 총점과 평균을 , 맨 마지막에 따로 정리해줘야 하는데(for 문을 따로 작성해야함)
각 학생의 점수를 받자마자 따로 정리해주고 있다.(프린트 위치가 잘못됨)

수정된 코드

package array.ex;
import java.util.Scanner;


public class ArrayEx7 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int[][] students = new int[4][3];
        String[] subjects = {"국어", "영어", "수학"};
        int[] sum = new int[4];
        int[] average = new int[4];

        for (int row = 0; row < students.length; row++){
            System.out.println(row+1 + "번 학생의 성적을 입력하세요!");

            for (int column = 0; column < students[row].length; column++){
                System.out.print(subjects[column] + "점수 :" );
                students[row][column] = input.nextInt();
                sum[row] += students[row][column];
            }
        }
        for (int i = 0; i < 4; i++) {
            average[i] = sum[i] / 3;
            System.out.println(i+1 + "번 학생의 총점 : " + sum[i] + ", 평균 : " + average[i]);
        }
    }
}

출력 결과

1번 학생의 성적을 입력하세요!
국어점수 :75
영어점수 :90
수학점수 :86
2번 학생의 성적을 입력하세요!
국어점수 :65
영어점수 :68
수학점수 :92
3번 학생의 성적을 입력하세요!
국어점수 :58
영어점수 :76
수학점수 :90
4번 학생의 성적을 입력하세요!
국어점수 :78
영어점수 :95
수학점수 :100
1번 학생의 총점 : 251, 평균 : 83
2번 학생의 총점 : 225, 평균 : 75
3번 학생의 총점 : 224, 평균 : 74
4번 학생의 총점 : 273, 평균 : 91

종료 코드 0(으)로 완료된 프로세스

 

학생 수를 입력받고, 학생 수에 따라 과목별 성적을 입력받아 

성적의 총점과 평균을 출력 해보았다. 

추가된 부분은, 학생 수에 해당하는 변수 n 을 선언했고

변수 n 의 크기는 students.length 로 동적으로 처리했다.

package array.ex;
import java.util.Scanner;


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

        System.out.println("학생 수를 입력하세요");
        int n = input.nextInt();

        int[][] students = new int[n][3];

        String[] subjects = {"국어", "영어", "수학"};

        int[] sum = new int[4];
        int[] average = new int[4];

        for (int row = 0; row < students.length; row++){
            System.out.println(row+1 + "번 학생의 성적을 입력하세요!");

            for (int column = 0; column < students[row].length; column++){
                System.out.print(subjects[column] + "점수 :" );
                students[row][column] = input.nextInt();
                sum[row] += students[row][column];
            }
        }
        for (int i = 0; i < students.length; i++) {
            average[i] = sum[i] / 3;
            System.out.println(i+1 + "번 학생의 총점 : " + sum[i] + ", 평균 : " + average[i]);
        }
    }
}

 

2차원 배열과 

1차원 배열 sum, average 를 

어떤 위치에 선언 해야하는지 간단하게 알아보았습니다.