-> 블로그 이전

[명품 Java] 3장 실습문제 (반복문과 배열 그리고 예외 처리)

2021. 11. 17. 17:43Solution`/Java

[01]

다음 프로그램에 대해 물음에 답하라

int sum = 0, i = 0;
while (i < 100) {
    sum = sum + i;
    i += 2;
}
System.out.println(sum);

(1) 무엇을 계산하는 코드이며 실행 결과 출력되는 내용은?

출력 = 2450
목적 = 0 ~ 99까지 2의 배수들의 합

 

(2) 위의 코드를 main() 메소드를 만들고 WhileTest 클래스로 완성하라.

package chap03.Solution1;

public class WhileTest {
    public static void main(String[] args) {
        int sum = 0;
        int i = 0;

        while (i < 100) {
            sum += i;
            i += 2;
        }

        System.out.println(sum);
    }
}

 

(3) for 문을 이용하여 동일하게 실행되는 ForTest 클래스를 작성하라.

package chap03.Solution1;

public class ForTest {
    public static void main(String[] args) {
        int sum = 0;

        for (int i = 0; i < 100; i += 2) {
            sum += i;
        }

        System.out.println(sum);
    }
}

 

(4) do-while 문을 이용하여 동일하게 실행되는 DoWhileTest 클래스를 작성하라.

package chap03.Solution1;

public class DoWhileTest {
    public static void main(String[] args) {
        int sum = 0;
        int i = 0;

        do{
            sum += i;
            i += 2;
        } while (i < 100);

        System.out.println(sum);
    }
}

 

[02]

다음 2차원 배열 n을 출력하는 프로그램을 작성하라

int n[][] = {{1}, {1, 2, 3}, {1}, {1, 2, 3, 4}, {1, 2}};
package chap03;

public class Solution2 {
    public static void main(String[] args) {
        int[][] n = {
                {1},
                {1, 2, 3},
                {1},
                {1, 2, 3, 4},
                {1, 2}
        };

        for (int i = 0; i < n.length; i++) {
            for (int j = 0; j < n[i].length; j++) {
                System.out.print(n[i][j] + " ");
            }
            System.out.println();
        }
    }
}

 

[03]

Scanner을 이용하여 정수를 입력받고 다음과 같이 *를 출력하는 프로그램을 작성하라

정수를 입력하시오 >> 5
*****
****
***
**
*
package chap03;

import java.util.Scanner;

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

        System.out.print("정수를 입력하세요 >> ");
        int num = Integer.parseInt(sc.nextLine());

        for (int i = num; i >= 1; i--) {
            for (int j = 0; j < i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

[04]

Scanner를 이용하여 소문자 알파벳을 하나 입력받고 다음과 같이 출력하는 프로그램을 작성하라

소문자 알파벳 하나를 입력하시오 >> e
abcde
abcd
abc
ab
a
package chap03;

import java.util.Scanner;

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

        System.out.print("소문자 알파벳 하나를 입력하세요 >> ");
        char alpha = sc.nextLine().charAt(0);

        for (char i = alpha; i >= 'a'; i--) {
            for (char j = 'a'; j <= i; j++) {
                System.out.print(j);
            }
            System.out.println();
        }
    }
}

 

[05]

양의 정수를 10개 입력받아 배열에 저장하고, 배열에 있는 정수 중에서 3의 배수만 출력하는 프로그램을 작성하라

양의 정수 10개를 입력하시오 >> 1 5 99 22 345 125 2346 55 32 85
3의 배수는 99 345 2346 
package chap03;

import java.util.Scanner;

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

        System.out.print("양의 정수 10개를 입력하세요 >> ");
        String[] list = sc.nextLine().strip().split(" ");

        System.out.print("3의 배수는 ");

        boolean flag = false;
        for (String s : list) {
            if (Integer.parseInt(s) % 3 == 0) {
                flag = true;
                System.out.print(s + " ");
            }
        }

        if (!flag) {
            System.out.println("없습니다");
        }
    }
}

 

[06]

배열과 반복문을 이용하여 프로그램을 작성해보자. 키보드에서 정수로 된 돈의 액수를 입력받아 오만 원권, 만 원권, 천 원권, 500원짜리 동전, 100원짜리 동전, 50원짜리 동전, 10원짜리 동전, 1원짜리 동전이 각 몇 개로 변환되는지 예시와 같이 출력하라. 이때 반드시 다음 배열을 이용하고 반복문으로 작성하라.

금액을 입력하시오 >> 65123
50000 원 짜리 : 1개 
10000 원 짜리 : 1개 
1000 원 짜리 : 5개 
100 원 짜리 : 1개 
10 원 짜리 : 2개 
1 원 짜리 : 3개
package chap03;

import java.util.Collections;
import java.util.Scanner;

public class Solution6 {

    static final int[] UNIT = {50000, 10000, 1000, 500, 100, 50, 10, 1};
    static final String[] WORDS = {
            "50000원 짜리 : ",
            "10000원 짜리 : ",
            "1000원 짜리 : ",
            "500원 짜리 : ",
            "100원 짜리 : ",
            "50원 짜리 : ",
            "10원 짜리 : ",
            "1원 짜리 : "
    };

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

        System.out.print("금액을 입력하세요 >> ");
        int money = Integer.parseInt(sc.nextLine());

        for (int i = 0; i < UNIT.length; i++) {
            int cover = money / UNIT[i];

            if (cover == 0) {
                continue;
            } else {
                System.out.println(WORDS[i] + money / UNIT[i]);
                money %= UNIT[i];
            }
        }
    }
}

 

[07]

정수를 10개 저장하는 배열을 만들고 1에서 10까지 범위의 정수를 랜덤하게 생성하여 배열에 저장하라. 그리고 배열에 든 숫자들과 평균을 출력하라.

랜덤한 정수들 : 10 5 2 9 1 4 1 5 1 5
평균은 4.3
package chap03;

public class Solution7 {
    public static void main(String[] args) {
        int[] list = new int[10];

        for (int i = 0; i < list.length; i++) {
            list[i] = (int)(Math.random() * 10 + 1);
        }

        System.out.print("랜덤한 정수들 : ");
        for (int n : list) {
            System.out.print(n + " ");
        }

        System.out.print("\n평균은 " + getAverage(list));
    }

    static double getAverage(int[] list) {
        int sum = 0;

        for (int n : list) {
            sum += n;
        }

        return (double)sum / list.length;
    }
}

 

[08]

정수를 몇 개 저장할지 키보드로부터 개수를 입력받아(100보다 작은 개수) 정수 배열을 생성하고, 이곳에 1에서 100까지 범위의 정수를 랜덤하게 삽입하라. 배열에는 같은 수가 없도록 하고 배열을 출력하라.

정수 몇개? >> 24
48 33 74 94 17 39 55 8 59 81 
72 31 63 90 75 2 85 19 84 24 
98 32 86 58
package chap03;

import java.util.Scanner;

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

        System.out.print("정수 몇개 ? ");
        int N = Integer.parseInt(sc.nextLine());
        int[] list = new int[N];

        for (int i = 0; i < N; i++) {
            list[i] = (int)(Math.random() * 100 + 1);

            for (int j = 0; j < i; j++) {
                if (list[j] == list[i]) {
                    i--;
                    break;
                }
            }
        }

        for (int i = 0; i < N; i++) {
            System.out.print(list[i] + "\t");

            if ((i + 1) % 10 == 0) {
                System.out.println();
            }
        }
    }
}

 

[09]

4 x 4의 2차원 배열을 만들고 이곳에 1에서 10까지 범위의 정수를 랜덤하게 생성하여 정수 16개를 배열에 저장하고, 2차원 배열을 화면에 출력하라.

6 10 1 8
1 3 7 2
8 4 5 1
1 8 4 4
package chap03;

public class Solution9 {
    public static void main(String[] args) {
        int[][] list = new int[4][4];

        for (int i = 0; i < list.length; i++) {
            for (int j = 0; j < list[i].length; j++) {
                list[i][j] = (int)(Math.random() * 10 + 1);
            }
        }

        for (int i = 0; i < list.length; i++) {
            for (int j = 0; j < list[i].length; j++) {
                System.out.print(list[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

 

[10]

4 x 4의 2차원 배열을 만들고 이곳에 1에서 10까지 범위의 정수를 10개만 랜덤하게 생성하여 임의의 위치에 삽입하라. 동일한 정수가 있어도 상관없다. 나머지 6개의 숫자는 모두 0이다. 만들어진 2차원 배열을 화면에 출력하라.

5 0 8 6
0 7 9 5
2 4 0 8
0 0 0 8
package chap03;

public class Solution10 {
    public static void main(String[] args) {
        int[][] list = new int[4][4];
        int count = 0;

        while (count != 10) {
            int index1 = (int) (Math.random() * 4);
            int index2 = (int) (Math.random() * 4);

            if (list[index1][index2] == 0) {
                list[index1][index2] = (int) (Math.random() * 10 + 1);
                count++;
            }
        }

        for (int i = 0; i < list.length; i++) {
            for (int j = 0; j < list[i].length; j++) {
                System.out.print(list[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

 

[11]

다음과 같이 작동하는 Average.java를 작성하라. 명령행 인자는 모두 정수만 사용되며 정수들의 평균을 출력한다. 다음 화면은 컴파일된 Average.class 파일을 c:\Temp 디렉터리에 복사한 뒤 실행한 경우이다. 원본 Average.class 파일은 이클립스의 프로젝트 폴더 밑에 bin 폴더에 있다.

package chap03;

public class Solution11 {
    public static void main(String[] args) {
        int sum = 0;

        for (String arg : args) {
            sum += Integer.parseInt(arg);
        }

        System.out.println((double)sum / args.length);
    }
}

 

[12]

다음과 같이 작동하는 Add.java를 작성하라. 명령행 인자 중에서 정수 만을 골라 합을 구하라. 다음 화면은 Add.class 파일을 c:\Temp 디렉터리에 복사한 뒤 실행한 경우이다. 원본 Add.class 파일은 이클립스 프로젝트 폴더 밑에 bin 폴더에 있다.

package chap03;

public class Solution12 {
    public static void main(String[] args) {
        int sum = 0;

        for (String arg : args) {
            try {
                int num = Integer.parseInt(arg);
                sum += num;
            } catch (NumberFormatException e) {
                continue;
            }
        }

        System.out.println(sum);
    }
}

 

[13]

반복문을 이용하여 369게임에서 박수를 쳐야 하는 경우를 순서대로 화면에 출력해보자. 1부터 시작하며 99까지만 한다. 실행 사례는 다음과 같다.

package chap03;

public class Solution13 {
    public static void main(String[] args) {
        for (int num = 1; num < 100; num++) {
            if (getThreeSixNine(num) == 2) {
                System.out.println(num + " 박수 짝짝");
            } else if (getThreeSixNine(num) == 1) {
                System.out.println(num + " 박수 짝");
            }
        }
    }

    static int getThreeSixNine(int num) {
        int one = num % 10;
        int ten = num / 10;

        int count = 0;
        if (validation(one)) {
            count++;
        }
        if (validation(ten)) {
            count++;
        }

        return count;
    }

    static boolean validation(int c) {
        return c == 3 || c == 6 || c == 9;
    }
}

 

[14]

다음 코드와 같이 과목과 점수가 짝을 이루도록 2개의 배열을 작성하라.

String course[] = {"Java", "C++", "HTML5", "컴퓨터구조", "안드로이드"};
int score[]  = {95, 88, 76, 62, 55};

그리고 다음 예시와 같이 과목 이름을 입력받아 점수를 출력하는 프로그램을 작성하라. "그만"을 입력받으면 종료한다.

과목 이름 >> Jaba
없는 과목입니다.
과목 이름 >> Java
Java의 점수는 95
과목 이름 >> 안드로이드
안드로이드의 점수는 55
과목 이름 >> 그만
package chap03;

import java.util.Scanner;

public class Solution14 {

    static String[] COURSE = {"Java", "C++", "HTML5", "컴퓨터구조", "안드로이드"};
    static int[] SCORE = {95, 88, 76, 62, 55};

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

        while (true) {
            System.out.print("과목 이름 >> ");
            String subject = sc.nextLine();

            if (subject.equals("그만")) {
                break;
            }

            int index = getSubjectIndex(subject);
            if (index == -1) {
                System.out.println("없는 과목입니다.");
            } else {
                System.out.println(COURSE[index] + "의 점수는 " + SCORE[index]);
            }
        }
    }

    static int getSubjectIndex(String subject) {
        int index = 0;
        boolean flag = false;

        for (int i = 0; i < COURSE.length; i++) {
            if (COURSE[i].equals(subject)) {
                index = i;
                flag = true;
                break;
            }
        }

        if (flag) {
            return index;
        } else {
            return -1;
        }
    }
}

 

[15]

다음은 2개의 정수를 입력 받아 곱을 구하는 Muliply 클래스이다.

import java.util.Scanner;
public class Multiply {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("곱하고자 하는 두 수 입력 >> ");
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        System.out.print(n+ "x" + m + "=" + n*m);
        scanner.close();
    }
}

다음과 같이 실행할 때 프로그램은 10과 5를 곱해 50을 잘 출력한다.

곱하고자 하는 두 수 입력 >> 10 5
10x5=50

하지만, 다음과 같이 실수를 입력하였을 때, 예외가 발생한다.

곱하고자 하는 두 수 입력 >> 2.5 4
Exception in thread "main" java.util.InputMismatchException
   at java.util.Scanner.throwFor(Unknown Source)
   at java.util.Scanner.next(Unknown Source)
   at java.util.Scanner.nextInt(Unknown Source)
   at java.util.Scanner.nextInt(Unknown Source)
   at java_study3_15.Multiply.main(Multiply.java:11)

다음과 같이 실수가 입력되면 정수를 다시 입력하도록 하여 예외 없이 정상적으로 처리되도록 예외 처리 코드를 삽입하여 Multiply 클래스를 수정하라.

곱하고자 하는 두 수 입력 >> 2.5 4
실수는 입력하면 안됩니다.
곱하고자 하는 두 수 입력 >> 4 3.5
실수는 입력하면 안됩니다.
곱하고자 하는 두 수 입력 >> 4 3
4x3=12
package chap03;

import java.util.InputMismatchException;
import java.util.Scanner;

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

        while(true) {
            try {
                System.out.print("곱하고자 하는 두 수 입력 >> ");
                int num1 = sc.nextInt();
                int num2 = sc.nextInt();

                System.out.println(num1 + " x " + num2 + " = " + (num1 * num2));
                break;
            } catch (InputMismatchException e) {
                System.out.println("실수는 입력하면 안됩니다.");
                sc.nextLine();
            }
        }
    }
}

 

 

[16]

컴퓨터와 독자 사이의 가위 바위 보 게임을 만들어보자. 예시는 다음 그림과 같다. 독자부터 먼저 시작한다. 독자가 가위 바위 보 중 하나를 입력하고 <Enter>키를 치면, 프로그램은 가위 바위 보 중에서 랜덤하게 하나를 선택하고 컴퓨터가 낸 것으로 한다. 독자가 입력한 값과 랜덤하게 선택한 값을 비교하여 누가 이겼는지 판단한다. 독자가 가위 바위 보 대신 "그만"을 입력하면 게임을 끝난다.

컴퓨터와 가위 바위 보 게임을 합니다.
가위 바위 보! >> 바위
사용자 = 바위 , 컴퓨터 = 가위 사용자가 이겼습니다.
가위 바위 보! >> 가위
사용자 = 가위 , 컴퓨터 = 가위 비겼습니다.
가위 바위 보! >> 그만
게임을 종료합니다...
package chap03;

import java.util.Scanner;

public class Solution16 {

    static final String[] SELECT = {"가위", "바위", "보"};

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

        System.out.println("컴퓨터와 가위 바위 보 게임을 합니다");

        while (true) {
            System.out.print("가위 바위 보! >> ");
            String userSelect = sc.nextLine();

            if (userSelect.equals("그만")) {
                System.out.println("게임을 종료합니다...");
                break;
            }

            String comSelect = SELECT[(int) (Math.random() * 3)];
            validationMatch(userSelect, comSelect);
        }
    }

    static void validationMatch(String user, String com) {
        if (user.equals("가위")) {
            if (com.equals("가위")) {
                System.out.println("사용자 = " + user + " VS 컴퓨터 = " + com + " -> 비겼습니다");
            } else if (com.equals("바위")) {
                System.out.println("사용자 = " + user + " VS 컴퓨터 = " + com + " -> 컴퓨터가 이겼습니다...");
            } else {
                System.out.println("사용자 = " + user + " VS 컴퓨터 = " + com + " -> 사용자가 이겼습니다!!");
            }
        } else if (user.equals("바위")) {
            if (com.equals("가위")) {
                System.out.println("사용자 = " + user + " VS 컴퓨터 = " + com + " -> 사용자가 이겼습니다!!");
            } else if (com.equals("바위")) {
                System.out.println("사용자 = " + user + " VS 컴퓨터 = " + com + " -> 비겼습니다");
            } else {
                System.out.println("사용자 = " + user + " VS 컴퓨터 = " + com + " -> 컴퓨터가 이겼습니다...");
            }
        } else {
            if (com.equals("가위")) {
                System.out.println("사용자 = " + user + " VS 컴퓨터 = " + com + " -> 컴퓨터가 이겼습니다...");
            } else if (com.equals("바위")) {
                System.out.println("사용자 = " + user + " VS 컴퓨터 = " + com + " -> 사용자가 이겼습니다!!");
            } else {
                System.out.println("사용자 = " + user + " VS 컴퓨터 = " + com + " -> 비겼습니다");
            }
        }
    }
}