Java Programming for Starter(5-1)

Beautify.log·2021년 12월 12일
0

Java 튜토리얼

목록 보기
6/14
post-thumbnail

안녕하세요. 오늘 포스팅은 연습문제 풀이입니다.

원래는 5번째 포스팅에 함께 실어보려고 했으나 작성해야 할 로직이 좀 많아서 따로 나눠서 올립니다.

문제는 한문제인데 여러 기능을 요구합니다.

자, 그럼~~ 따라오시죠

문제


  1. 학생들의 정보를 2차원 배열에서 입력 받는다.
    1-1. 이름, 생년월일, 국어, 영어, 수학 점수
    1-2. 입력받을 학생 수, i번째 학생의 이름, 생년월일, 국어, 영어, 수학점수 순으로 입력받기
  2. 각 학생들의 국어, 영어, 수학 점수를 합친 총점, 개개인의 총점을 구한다.
  3. 학생들의 국어 점수 총점을 구한다.
  4. 영어 점수의 최고점을 구한다.
  5. 수학점수의 최저점을 구한다.
  6. 학급에서 1등은 누구인지 이름을 출력한다.

기본 세팅


새로운 프로젝트 파일을 만들어서 우선 기본적인 세팅을 해줍시다.

public class Main {

    public static void main(String[] args) {
    
    }
    
}

우선 함수를 학습한 후 복습하는 차원에서 문제를 푸는 것이기 때문에 모든 기능을 함수로 구현해서 호출하는 방식을 사용할겁니다.


정보를 담아줄 배열 초기화


우선 학생들의 정보를 저장해줄 2차원 배열을 main 함수에서 초기화 해주고, 함수를 통해 입력을 받아보겠습니다.

public class Main {

    public static void main(String[] args) {
    
    	String[][] students = null;
        
    }
    
}

우선 자바는 배열안에 들어갈 원소들의 자료형이 통일되어야 합니다.
우리가 입력받을 정보는 "이름, 생년월일, 국어, 영어, 수학 점수"이기 때문에 숫자와 문자열이 혼합되어 있습니다. 그래서 입력받을 모든 정보를 String으로 간주할 것입니다.

또한 배열의 초기화는 null로 합니다.


배열 내 원소의 정보를 입력받는 함수 작성하기


자 이제 배열 안에 정보를 입력받기 위해 어떻게 해야할지 먼저 생각을 해보겠습니다.

값을 입력받아야 하기 때문에 Scanner가 필요하므로 import 해주겠습니다.

import java.util.*;
// 또는 import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    
    	String[][] students = null;
        
    }
    
}

그리고 main 함수 바깥에서 다른 함수를 만들어주겠습니다.

import java.util.*;
// 또는 import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    
    	String[][] students = null;
        
    }
    
    // main 함수 바깥에서 함수 선언
    public static String[][] countStudent () {	// 반환할 자료형이 String 타입의 2차원 배열, 매개변수는 없음
    
    }
    
}

이제 입력을 받기 위해 Scanner를 지정해주고 임의의 빈 배열을 만들어 배열에 들어갈 원소의 개수를 지정해주겠습니다.

import java.util.*;
// 또는 import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    
    	String[][] students = null;
        
    }
    
    // main 함수 바깥에서 함수 선언
    public static String[][] countStudent () {	// 반환할 자료형이 String 타입의 2차원 배열, 매개변수는 없음
    	Scanner sc = new Scanner(System.in);
        System.out.println("입력할 학생 수 >> ");
        int count = sc.nextInt();
        
        // 행의 개수는 입력받은 학생수만큼, 행마다 들어갈 정보는 5개로 이미 제한되어 있으므로 5로 고정
        String[][] students = new int [count][5];
    }
    
}

그 다음으로 반복문을 돌려가며 입력받은 학생수만큼 정보를 입력해서 배열에 저장해줍니다.
그 다음 임의로 만들어둔 배열을 return 해주겠습니다.

import java.util.*;
// 또는 import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    
    	String[][] students = null;
        
    }
    
    // main 함수 바깥에서 함수 선언
    public static String[][] countStudent () {	// 반환할 자료형이 String 타입의 2차원 배열, 매개변수는 없음
    	Scanner sc = new Scanner(System.in);
        System.out.println("입력할 학생 수 >> ");
        int count = sc.nextInt();
        
        // 행의 개수는 입력받은 학생수만큼, 행마다 들어갈 정보는 5개로 이미 제한되어 있으므로 5로 고정
        String[][] students = new int [count][5];
        
        for (int i = 0; i < students.length; i++) {
            System.out.print((i+1) + "번째 학생의 이름 >> ");
            students[i][0] = sc.next();
            System.out.print((i+1) + "번째 학생의 생년월일(yyyy-mm-dd) >> ");
            students[i][1] = sc.next();
            System.out.print((i+1) + "번째 학생의 국어점수 >> ");
            students[i][2] = sc.next();
            System.out.print((i+1) + "번째 학생의 영어점수 >> ");
            students[i][3] = sc.next();
            System.out.print((i+1) + "번째 학생의 수학점수 >> ");
            students[i][4] = sc.next();
    }
    
    return students;
    
}

자 그러면 함수를 배열에 적용해줘야겠죠? main 함수에서 임의로 만들어준 배열에 함수를 바로 적용해주겠습니다.

import java.util.*;
// 또는 import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    
    	String[][] students = countStudent();
        
    }
    
    // main 함수 바깥에서 함수 선언
    public static String[][] countStudent () {	
    
    	...
    
    }
    
}

과목별 총점을 구해주는 함수 작성하기


함수를 작성할 때 고려해야할 것으로 parameter가 있습니다. 이제부터 작성할 함수들은 우리가 입력받은 배열 안의 요소들을 계산해주는 함수입니다.

예를 들어 다음과 같이 배열이 작성되었다고 가정해봅시다.

String[][] student = {
	// 이름	     생년월일      국어   영어   수학
	{ "홍길동", "1996-10-22", "70", "40", "80" },
    	{ "성춘향", "1996-07-11", "80", "90", "50" }
}

그렇다면 국어의 총점은 배열 student[i]번째의 [2]번째 즉, student[i][2]번째에 있는 점수만 긁어와서 더해주면 됩니다.

저는 for each문을 써서 작성해보겠습니다.

학생 수를 입력받은 것과 마찬가지로 main 함수 밖에서 작성해주면 됩니다.

public static int[] totalScore (String[][] student) {
	int[] scores = { 0, 0, 0 };	// 임의의 빈 배열 작성(점수가 되는 배열 인덱스 기준)
    
    for(int j=2; j < 5; j++) {	// 배열의 두번째부터 
    	for (String[] students : student) {	// student 안에 있는 각 students를 순회하며 작업처리
        	scores[j - 2] += Integer.parseInt(students[j]);	// 배열의 j번째(j-2는 위에서 임의로 선언해준 배열의 0번째)
        }
    }
    
    return scores;
}

parameter로 받아온 students 배열의 j번째 요소를 score라는 배열에 담아줍니다. 그러면 합쳐진 점수들이 담깁니다.


개인별 점수의 합계를 구해주는 함수 작성하기


public static int[] individualTotal (String[][] student) {
	int[] scores = new int [student.length];
    int total = 0;
    
    for(int i=0; i < student.length; i++) {
    	total = 0;
        for (int j=2; j < student[0].length; j++) {
        	total += Integer.parseInt(student[i][j]);
        }
        
        scores[i] = total;
    }

	return scores;
}

우선 빈 배열을 하나 만들어서 parameter로 받아온 배열과 같은 크기로 만들어줍니다.

그리고 합계는 반복문을 돌려서 구해줄 것이기 때문에 변수를 하나 잡아서 초기화 해줍니다.

그리고 student.length만큼 반복하는데 2번째 요소 즉 국어점수부터 각각 더해서 total 변수에 저장해주고 score 배열에 넣어줍니다.

단, total은 정수형으로 선언되었으므로 배열의 원소로 들어가있는 String을 숫자로 바꿔주어야 합니다. 그래서 parseInt() 메서드를 사용했습니다.

마지막으로 score 배열을 return 해줍니다.


과목별 점수 합계를 구해주는 함수 작성하기


public static int koreanTotal (String[][] student) {

	int total = 0;
    
    	for (int i = 0; i < student.length; i++) {
    		total += Integer.parseInt(student[i][2]);
    	}
        
        return total;

}

마찬가지로 점수의 합을 구해줘야하기 때문에 초기화된 어떤 변수가 필요해서 total을 선언해주었습니다.

반복문을 돌려서 각 배열의 i번째에서 2번째에 있는 점수를 조회해 정수형으로 바꾸고 total에 저장해줍니다.

영어, 수학점수는 total에 저장될 배열의 인덱스를 3, 4로 각각 바꿔주면 됩니다.


영어 점수의 최고점 구하는 함수 작성하기

저는 우선 최고점을 어떻게 구할 수 있을지 생각하다 배열을 한 번 정렬해주고 거기에서 맨 앞에 있는 값이나 맨 뒤에 있는 값을 가져오기로 결정했습니다.

그래서 최종적으로 최고점은 내림차순으로 정렬 후 0번째 인덱스를 보여주면 되겠다고 생각했습니다.

public static int engTop (String[][] student) {
    int[] scoreArr = new int [student.length];

    // 영어점수 가져오기
    for (int i = 0; i < student.length; i++) { 
        scoreArr[i] += Integer.parseInt(student[i][3]);
    }
        
    // 내림차순으로 정렬
    // Arrays.sort(scoreArr);
    int temp;
    for (int i = 0; i < scoreArr.length - 1; i++) {
        for (int j = i+1; j < scoreArr.length; j++) {
            if (scoreArr[i] < scoreArr[j]) {
                temp = scoreArr[i];
                scoreArr[i] = scoreArr[j];
                scoreArr[j] = temp;
            }
        }
    }

    // 최대값 뽑기
    int result = scoreArr[0];

    return result;
       
}

수학 점수의 최저점 구하는 함수 작성하기


수학 점수도 영어 점수와 마찬가지로 정렬을 통해 점수를 나열해준 뒤 맨 앞에 있는 값이나 맨 뒤에 있는 값을 가져오려고 하였습니다.

최저점은 오름차순으로 정렬 후 0번째 인덱스에 있는 값을 가져오도록 하겠습니다.

public static int mathLow (String[][] student) {
    int[] scoreArr = new int [student.length];

    // 수학점수 가져오기
    for (int i = 0; i < student.length; i++) {
        scoreArr[i] += Integer.parseInt(student[i][4]);
    }

    // 오름차순으로 정렬
    // Arrays.sort(scoreArr);
    int temp;
    for (int i = 0; i < scoreArr.length - 1; i++) {
        for (int j = i+1; j < scoreArr.length; j++) {
            if (scoreArr[i] > scoreArr[j]);
                temp = scoreArr[i];
                scoreArr[i] = scoreArr[j];
                scoreArr[j] = temp;
        }
    }

    // 최소값 뽑기
    int result = scoreArr[0];

    return result;

    }

1등 학생의 이름을 가져오는 함수 작성하기

은근히 고민할게 많았었던 것 같습니다.

배열안에 있는 합계들만 구해서 각각의 인덱스를 한꺼번에 비교할 수 없는지 생각도 해보고 여튼 별짓을 다했습니다.

그래서 총점을 구하는 로직을 조금 변형해서 index라는 String 형태의 변수를 주고 빈 배열에 점수를 넣어준 다음에 채워진 배열의 인덱스를 첫번째 인덱스와 비교해서 i번째 인덱스가 더 클 경우 인덱스에 값을 저장한 후에 indexreturn하게 했습니다.

public static String rank (String student[][]) {

    int[] toCompareScore = new int [student.length];
    
    int total;
    String index = "";
    
    for (int i = 0; i < student.length; i++) {
        total = 0;
        for (int j = 2; j < student[0].length; j++) {
            total += Integer.parseInt(student[i][j]);
        }
        toCompareScore[i] += total;

        if (toCompareScore[i] > toCompareScore[0]) {
            index = student[i][0];
        }
    }

    return index;

}

최종본


package com.company;

import java.util.*;

public class Main {

//    private static String[][] students;

    public static void main(String[] args) {
        /*
           2021년 12월 10일 과제

           1. 학생들의 정보를 2차원 배열에서 입력 받는다.
             1-1. 이름, 생년월일, 국어, 영어, 수학 점수
             1-2. 입력받을 학생 수, i번째 학생의 이름, 생년월일, 국어, 영어, 수학점수 순으로 입력받기
           2. 각 학생들의 국어, 영어, 수학 점수를 합친 총점, 개개인의 총점을 구한다.
           3. 학생들의 국어 점수 총점을 구한다.
           4. 영어 점수의 최고점을 구한다.
           5. 수학점수의 최저점을 구한다.
           6. 학급에서 1등은 누구인지 이름을 출력한다.
        */

        /*
            { { 이름, 생년월일, 국어, 영어, 수학 } }
            국어 = i번째의 j[2] ===>
            영어 = i번째의 j[3]
            수학 = i번째의 j[4]
        */

        // 학생들의 정보를 2차원 배열에 입력 받기
        String[][] students = countStudent();
        // System.out.println(scores);

        // 각 과목별 총점 출력
        int[] scores = totalScore(students);
        System.out.println("국어 총점 : " + scores[0]);
        System.out.println("영어 총점 : " + scores[1]);
        System.out.println("수학 총점 : " + scores[2]);

        // 개인별 총점 출력
        int[] indivTotal = individualTotal(students);
        for (int i = 0; i < indivTotal.length; i++) {
            System.out.println((i+1) + "번째 학생의 총점은 " + indivTotal[i] + "점");
        }

        // 국어점수의 총점 구하기
        int korTotal = koreanTotal(students);
        System.out.println("모든 학생의 국어 총점은 " + korTotal + "점");

        // 수학점수의 총점 구하기
        int mathTotal = mathTotal(students);
        System.out.println("모든 학생의 수학 총점은 " + mathTotal + "점");

        // 영어점수의 총점 구하기
        int engTotal = engTotal(students);
        System.out.println("모든 학생의 영어 총점은 " + engTotal + "점");

        // 영어점수의 최고점 구하기
        int engTop = engTop(students);
        System.out.println("영어점수의 최고점은 " + engTop + "점");

        // 수학점수의 최저점 구하기
        int mathLow = mathLow(students);
        System.out.println("수학점수의 최저점은 " + mathLow + "점");

        // 학급에서 1등 누군지 구하기
        String ranking = rank(students);
        System.out.println("1등 학생의 이름은 \"" + ranking + "\"");


    }

    // 학생 수 입력
    public static String[][] countStudent () {
        Scanner sc = new Scanner(System.in);
        System.out.print("입력할 학생 수 >> ");
        int count = sc.nextInt();

        String[][] students = new String[count][5];

        for (int i = 0; i < students.length; i++) {
            // for (int j = 0; j < students[0].length; j++) {
            System.out.print((i+1) + "번째 학생의 이름 >> ");
            students[i][0] = sc.next();
            System.out.print((i+1) + "번째 학생의 생년월일(yyyy-mm-dd) >> ");
            students[i][1] = sc.next();
            System.out.print((i+1) + "번째 학생의 국어점수 >> ");
            students[i][2] = sc.next();
            System.out.print((i+1) + "번째 학생의 영어점수 >> ");
            students[i][3] = sc.next();
            System.out.print((i+1) + "번째 학생의 수학점수 >> ");
            students[i][4] = sc.next();
        }

        return students;
    }

    // 전체 점수 합
    public static int[] totalScore (String[][] student) {
        int[] scores = { 0, 0, 0 };

        for(int j=2; j < student.length; j++) {
            for (String[] students : student) {
                scores[j - 2] += Integer.parseInt(students[j]);
            }
        }

        return scores;
    }

    // 개인별 점수 합
    public static int[] individualTotal (String[][] student) {
        int[] scores = new int [student.length];
        int total = 0;

        for(int i=0; i < student.length; i++) {
            total = 0;
            for (int j=2; j < student[0].length; j++) {
                total += Integer.parseInt(student[i][j]);
            }
            scores[i] = total;
        }
        return scores;
    }

    // 국어 점수의 총점
    public static int koreanTotal (String[][] student) {
        int total = 0;

        for (int i = 0; i < student.length; i++) {
            total += Integer.parseInt(student[i][2]);
        }

        return total;
    }

    // 수학 점수의 총점
    public static int mathTotal (String[][] student) {
        int total = 0;

        for (int i = 0; i < student.length; i++) {
            total += Integer.parseInt(student[i][4]);
        }

        return total;
    }

    // 영어 점수의 총점
    public static int engTotal (String[][] student) {
        int total = 0;

        for (int i = 0; i < student.length; i++) {
            total += Integer.parseInt(student[i][3]);
        }

        return total;
    }
    
    // 영어 점수의 최고점
    public static int engTop (String[][] student) {
        int[] scoreArr = new int [student.length];

        // 영어점수 가져오기
        for (int i = 0; i < student.length; i++) { 
            scoreArr[i] += Integer.parseInt(student[i][3]);
        }
        
        // 내림차순으로 정렬
        // Arrays.sort(scoreArr);
        int temp;
        for (int i = 0; i < scoreArr.length - 1; i++) {
            for (int j = i+1; j < scoreArr.length; j++) {
                if (scoreArr[i] < scoreArr[j]) {
                    temp = scoreArr[i];
                    scoreArr[i] = scoreArr[j];
                    scoreArr[j] = temp;
                }
            }
        }

        // 최대값 뽑기
        int result = scoreArr[0];

        return result;
        
    }

    // 수학점수의 최저점
    public static int mathLow (String[][] student) {
        int[] scoreArr = new int [student.length];

        // 수학점수 가져오기
        for (int i = 0; i < student.length; i++) {
            scoreArr[i] += Integer.parseInt(student[i][4]);
        }

        // 오름차순으로 정렬
        // Arrays.sort(scoreArr);
        int temp;
        for (int i = 0; i < scoreArr.length - 1; i++) {
            for (int j = i+1; j < scoreArr.length; j++) {
                if (scoreArr[i] > scoreArr[j]);
                    temp = scoreArr[i];
                    scoreArr[i] = scoreArr[j];
                    scoreArr[j] = temp;
            }
        }

        // 최소값 뽑기
        int result = scoreArr[0];

        return result;

    }

    // 1등 학생 구하기
    public static String rank (String student[][]) {
        int[] toCompareScore = new int [student.length];

        int total;
        String index = "";

        for (int i = 0; i < student.length; i++) {
            total = 0;
            for (int j = 2; j < student[0].length; j++) {
                total += Integer.parseInt(student[i][j]);
            }
            toCompareScore[i] += total;

            if (toCompareScore[i] > toCompareScore[0]) {
                index = student[i][0];
            }
        }

        return index;

    }
}
profile
tried ? drinkCoffee : keepGoing;

0개의 댓글