JAVA

JAVA - 배열 연습문제

jonghyeon6084 2023. 12. 28. 23:43
728x90

문제 1.

  - 코드 리펙토링

int student1 = 90;
int student2 = 80;
int student3 = 70;
int student4 = 60;
int student5 = 50;

int total = student1 + student2 + student3 + student4 + student5;
double average = (double) total / 5;

System.out.println("점수 총합 = " + total);
System.out.println("점수 평균 = " + average);

 - 위 코드 배열로 리펙토링 해보기.

 

// 개선 코드
        int[] students = {90, 80, 70, 60, 50};

        int total = 0;
        //첫번째로 작성한 코드
//        for (int i = 0; i < students.length; i++) {
//            int student = students[i];
//            total += student;
//        }

        //두번째로 작성한 코드
        for (int i = 0; i < students.length; i++) {
            total += students[i];
        }

        //향상된 for문으로
        for (int student : students) {
            total += student;
        }

        double average = (double) total / students.length;

        System.out.println("점수 총합 = " + total);
        System.out.println("점수 평균 = " + average);

 

문제를 풀면서 큰 어려움은 없었다. 다만 for문을 쓰는 과정에서 

//첫번째로 작성한 코드
        for (int i = 0; i < students.length; i++) {
            int student = students[i];
            total += student;
        }

첫 번째 작성한 코드에서는 굳이 int student = students[i]; 라는 것이 들어갈 필요 없이 바로 total += students[i]로 하면 되었었고, 그게 두번째로 작성한 코드이다.

 

그리고 위 코드에선 따로 index가 필요 없으므로 for-each문으로 바로 작성해도 되었지만, 익숙하지 않았다..

 

문제2. 배열의 입력과 출력

 - 사용자에게 5개의 정수를 입력받아서 배열에 저장하고, 입력 순서대로 출력하자.

 - 출력시 출력 포맷은 1, 2, 3, 4, 5 와 같이 , 쉼표를 사용해서 구분하고, 마지막에는 쉼표를 넣지 않아야 한다.

 

Scanner scanner = new Scanner(System.in);
int[] numbers = new int[5];
System.out.println("5개의 정수를 입력하세요 : ");
for (int i = 0; i < numbers.length; i++) {
    numbers[i] = scanner.nextInt();
}

System.out.println("출력");
for (int i = 0; i < numbers.length; i++) {
    System.out.print(numbers[i]);
    if (i < numbers.length - 1) {
        break;
    }
    System.out.print(", ");
}

 

여기서 살짝 고민했던 부분은 5 다음 쉼표(,)가 들어가지 않게 하는 것이었다.

 

위에 보이는 것 처럼 조건문을 걸어서 사용하면 되었지만 바로 생각이 나지 않았다..

 

문제3. 배열과 역순 출력

- 위 문제와 다 똑같지만, 역순으로 출력하는 부분만 다르다.

Scanner scanner = new Scanner(System.in);
        int[] numbers = new int[5];
        System.out.println("5개의 정수를 입력하세요 : ");
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = scanner.nextInt();
        }

        System.out.println("출력");
        for (int i = numbers.length-1; i >= 0 ; i--) {
            System.out.print(numbers[i]);
            //첫 번째 방법
//            if (i == 0) {
//                break;
//            }
            //두 번째 방법
            if (i > 0) {
                System.out.print(", ");
            }
        }

난 첫 번째 방법으로 풀었지만, 두 번째 방법도 있어서 둘 다 적어보았다.

 

문제4. 합계와 평균

- 사용자에게 n개의 정수를 입력받아서 이들 정수의 합계와 평균을 계산하는 프로그램을 만들자.(사용자가 원하는 만큼)

Scanner scanner = new Scanner(System.in);
System.out.println("입력받을 숫자의 개수를 입력하세요 : ");
int count = scanner.nextInt();
int[] numbers = new int[count];

System.out.println(count +"개의 정수를 입력하세요 : ");

int sum = 0;
for (int i = 0; i < numbers.length; i++) {
    numbers[i] = scanner.nextInt();
    sum += numbers[i];
}
double average = (double) sum / numbers.length;

System.out.println("입력한 정수의 합계 : " + sum);
System.out.println("입력한 정수의 평균 : " + average);

 

 

문제5. 가장 작은 수, 큰 수 찾기

 - 사용자로부터 n개의 정수를 입력받아 배열에 저장한 후, 배열 내에서 가장 작은 수와 가장 큰 수를 찾아 출력하는 프로그램을 만들기.

Scanner scanner = new Scanner(System.in);
System.out.println("입력받을 숫자의 개수를 입력하세요 : ");
int n = scanner.nextInt();
int[] numbers = new int[n];

System.out.println(n + "개의 정수를 입력하세요 : ");

int maxNum; // numbers의 배열 중 가장 큰 수
int minNum;
for (int i = 0; i < numbers.length; i++) {
    numbers[i] = scanner.nextInt();
}

maxNum = numbers[0];
minNum = numbers[0];
for (int i = 1; i < numbers.length; i++) {
    if (minNum > numbers[i]) {
        minNum = numbers[i];
    }
}

for (int i = 1; i < numbers.length; i++) {
    if (maxNum < numbers[i]) {
        maxNum = numbers[i];
    }
}
System.out.println("가장 작은 정수 : " + minNum);
System.out.println("가장 큰 정수 : " + maxNum);

여기서 힘들었던 부분은 작은 수와 큰 수를 찾는 방법이었는데 오랫동안 고민하다가 못찾아서 강의를 보니 maxNum, minNum을 임의의 숫자로 지정후 하나씩 비교하면서 작은 수, 큰 수를 찾아가는 것이었다.(사실 이런 방법은 생각도 못했다.)

 

문제6. 2차원 배열

 - 원하는 학생 수를 입력받아 학생들의 국어, 수학, 영어 점수를 입력받아 각 학생의 총점과 평균을 계산하는 프로그램을 만들자.

Scanner scanner = new Scanner(System.in);
        int[][] scores = new int[4][3];
        String[] subjects = {"국어", "수학", "영어"}; // 답안지 추가부분

//        int sum = 0;
//        double average = 0;

        for (int i = 0; i < 4; i++) {
            System.out.println((i + 1) + "번 학생의 성적을 입력하세요 : ");
            for (int j = 0; j < 3; j++) {
//                if (j == 0) {//필요 x
//                    System.out.print("국어 점수 : ");
                System.out.print(subjects[j] + " 점수 : ");// 답안지 추가부분
                scores[i][j] = scanner.nextInt();
            } // row for문 하나씩 끝날 때 마다 각각 학생의 총점과 평균을 정해놔야 할까??
        }
//        int sum1 = scores[0][0] + scores[0][1] + scores[0][2];
//        int sum2 = scores[1][0] + scores[1][1] + scores[1][2];
//        int sum3 = scores[2][0] + scores[2][1] + scores[2][2];
//        int sum4 = scores[3][0] + scores[3][1] + scores[3][2]; // for문으로 못 짜서 하드코딩 한 부분


//            double average1 = (double) sum1 / 3;
//            double average2 = (double) sum2 / 3;
//            double average3 = (double) sum3 / 3;
//            double average4 = (double) sum4 / 3; // 필요x


//            for (int i = 0; i < 4; i++) {
//                System.out.println(i + "번 학생의 총점 : " + (sum + i) + ", 평균 : " +
//                        (average + i));
//            } // 필요 x
        for (int i = 0; i < 4; i++) {
            int total = 0;
            for (int j = 0; j < 3; j++) {
                total += scores[i][j];
            }
            double average = (double) total / 3.0;
            System.out.println((i + 1) + "번 학생의 총점 : " + total + ", 평균 : " + average);
        }

사실 코드가 좀 어지럽다. 내가 풀었던 흔적이 남아 있는건데, 개인적으로는 좀 복잡해졌다라는 생각에 막막해서 일단 반복문을 바로 짜지 못하고 하드코딩으로 코드를 짜보았다. 

 

그 이후 하드코딩한 부분을 반복문으로 리펙토링하였고, 그리고 과목을 일일히 하드코딩으로 넣으려고 하였지만 답안지를 보니 과목이라는 배열을 따로 만들어서 배열로 돌리는게 훨씬 나아 보아서 추가하였다.

 

그리고 크게 고민한 부분이 합계, 평균을 구하는 부분이었는데, 반복문을 잘 활용하니 풀렸다.

아래는 결과를 정리한 코드이다.

Scanner scanner = new Scanner(System.in);
        int[][] scores = new int[4][3];
        String[] subjects = {"국어", "수학", "영어"}; // 답안지 추가부분

        for (int i = 0; i < 4; i++) {
            System.out.println((i + 1) + "번 학생의 성적을 입력하세요 : ");
            for (int j = 0; j < 3; j++) {
                System.out.print(subjects[j] + " 점수 : ");// 답안지 추가부분
                scores[i][j] = scanner.nextInt();
            } 
        }
        
//출력 부분
        for (int i = 0; i < 4; i++) {
            int total = 0;
            for (int j = 0; j < 3; j++) {
                total += scores[i][j];
            }
            double average = (double) total / 3.0;
            System.out.println((i + 1) + "번 학생의 총점 : " + total + ", 평균 : " + average);
        }

 

 

문제7. 상품 관리 프로그램 만들기

자바를 이용하여 상품 관리 프로그램을 만들어 보자. 이 프로그램은 다음의 기능이 필요하다:

 - 상품 등록: 상품 이름과 가격을 입력받아 저장한다.
 - 상품 목록: 지금까지 등록한 모든 상품의 목록을 출력한다.

다음과 같이 동작해야 한다:
 - 첫 화면에서 사용자에게 세 가지 선택을 제시한다: "1. 상품 등록", "2. 상품 목록", "3. 종료"

 - "1. 상품 등록"을 선택하면, 사용자로부터 상품 이름과 가격을 입력받아 배열에 저장한다.

 - "2. 상품 목록"을 선택하면, 배열에 저장된 모든 상품을 출력한다.
 - "3.
종료"를 선택하면 프로그램을 종료한다.

**제약 조건**
상품은 최대 10개까지 등록할 수 있다.

 

다음은 사용해야 하는 변수 및 구조이다:

 - `Scanner scanner` : 사용자 입력을 받기 위한 Scanner 객체

 - `String[] productNames` : 상품 이름을 저장할 String 배열

 - `int[] productPrices` : 상품 가격을 저장할 int 배열
 - `int productCount` : 현재 등록된 상품의 개수를 저장할 int 변수

이런식으로 콘솔에 찍혀야 한다.

Scanner scanner = new Scanner(System.in);
int maxProducts = 10;
String[] productNames = new String[maxProducts];
int[] productPrice = new int[maxProducts];
int productCount = 0;

while (true) {
    System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료\n메뉴를 선택하세요 : ");
    int menu = scanner.nextInt();
    scanner.nextLine();

    if (menu == 1) {
        if (productCount >= maxProducts) {
            System.out.println("더 이상 상품 등록을 할 수 없습니다.");
        } else {
            System.out.print("상품 이름 : ");
            productNames[productCount] = scanner.nextLine();

            System.out.print("상품 가격을 입력하세요 : ");
            productPrice[productCount] = scanner.nextInt();
            productCount++;
        }
    } else if (menu == 2) {
        if (productCount == 0) {
            System.out.println("등록된 상품이 없습니다.");
        } else {
            for (int i = 0; i < productCount; i++) {
                System.out.println(productNames[i] + ": " + productPrice[i] + "원");
            }
        }
    } else if (menu == 3) {
        System.out.println("프로그램을 종료합니다.");
        break;
    } else {
        System.out.println("잘못된 번호입니다.");
    }
}

참으로 감사하게 몇 가지 지정해야 할 변수를 알려주었다. 

 

처음에 생각하지 못했던 부분은 

1. 10개가 되었을 때 등록할 수 없다고 나오게 하기. >> 사실 매우 쉬운 건데 뭔가 문제가 길어보니까 그 두려움에 생각이 나지 않았던 거 같다.

2. 사용자가 상품과 가격을 등록할 때 마다 카운트를 어떻게 할까 싶었는데...위와 같은 이유로 몰랐지만 알고보니 너무나 쉬운 것..

 

이 것을 푸는 데에는 조금 오래 걸렸지만 풀고보니 너무 쉬웠다..

 

부트캠프에서 같이 교육 받던 친구가 했던 말이 생각난다.

 

"무작정 코드를 짜는 게 아니라 한번 생각을 하고 코드를 짜야 한다"

 

이거야 코드 길이가 얼마 길지 않아서 망정이지, 프로젝트를 진행하다 보면 코드가 엄청 길어져서 한번 잘못 짜면 전체를 갈아 엎어야하는 경우도 발생한다. 

코드를 빨리 짜는 것도 중요하지만, 코드를 짜기전에 틀 혹은 구조를 한번 생각하고 나서 코드를 짜는 습관을 들여보자.