-> 블로그 이전

[명품 Java] 2장 실습문제 (자바 기본 프로그래밍)

2021. 11. 13. 16:17Solution`/Java

[01]

Scanner 클래스를 이용하여 원화를 입력받아 달러로 바꾸어 다음 예시와 같이 출력하는 프로그램을 작성하라. $1=1100원으로 가정하고 계산하라.

package chap02;

import java.util.Scanner;

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

        System.out.print("원화를 입력하세요(단위 원) >> ");
        int money = Integer.parseInt(sc.nextLine());
        System.out.println(money + "원은 $" + exchangeWonToDollar(money) + "입니다.");

        sc.close();
    }

    static double exchangeWonToDollar(int won) {
        return (double)won / 1100;
    }
}

 

[02]

Scanner 클래스를 이용하여 2자리의 정수(10~99사이)를 입력받고, 십의 자리와 1의 자리가 같은지 판별하여 출력하는 프로그램을 작성하라.

package chap02;

import java.util.Scanner;

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

        System.out.print("2자리수 정수 입력(10 ~ 99) >> ");
        String num = sc.nextLine();

        if (validationNumber(num)) {
            System.out.println("Yes! 10의 자리와 1의 자리가 같습니다");
        } else {
            System.out.println("No! 10의 자리와 1의 자리가 다릅니다");
        }

        sc.close();
    }

    static boolean validationNumber(String num) {
        return num.charAt(0) == num.charAt(1);
    }
}

 

 

[03]

Scanner 클래스를 이용하여 정수로 된 돈의 액수를 입력받아 오만 원권, 만 원권, 천 원권, 500짜리 동전, 100원짜리 동전, 50원짜리 동전, 10원짜리 동전, 1원짜리 동전 각 몇 개로 변환되는지 출력하라.

package chap02;

import java.util.Scanner;

public class Solution3 {

    static final String[] CATEGORY = {"오만원권", "만원권", "천원권", "백원", "오십원", "십원", "일원"};
    static final int[] TYPE = {50000, 10000, 1000, 100, 50, 10, 1};
    static int[] count = new int[TYPE.length];

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

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

        exchangeMoney(money);
        getResult();

        sc.close();
    }

    static void exchangeMoney(int money) {
        for (int i = 0; i < count.length; i++) {
            count[i] = money / TYPE[i];
            money %= TYPE[i];
        }
    }

    static void getResult() {
        for (int i = 0; i < CATEGORY.length; i++) {
            if (i < 3) {
                System.out.println(CATEGORY[i] + " " + count[i] + "매");
            } else {
                System.out.println(CATEGORY[i] + " " + count[i] + "개");
            }
        }
    }
}

 

 

[04]

Scanner 클래스로 정수 3개를 입력받고 3개의 숫자 중 중간 크기의 수를 출력하라. 평균값을 구하는 것이 아님에 주의하라.

package chap02;

import java.util.Arrays;
import java.util.Scanner;

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

        System.out.print("정수 3개 입력 >> ");
        int[] line = Arrays.stream(sc.nextLine().strip().split(" "))
                .mapToInt(Integer::parseInt)
                .sorted()
                .toArray();

        System.out.println("중간 값은 " + line[1]);

        sc.close();
    }
}

 

 

[05]

Scanner를 이용하여 삼각형의 변의 길이를 나타내는 정수를 3개 입력받고 이 3개의 수로 삼각형을 만들 수 있는지 판별하라. 삼각형이 되려면 두변의 합이 다른 한 변의 합보다 커야 한다.

package chap02;

import java.util.Arrays;
import java.util.Scanner;

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

        System.out.print("정수 3개를 입력하시오 >> ");
        int[] list = Arrays.stream(sc.nextLine().strip().split(" "))
                .mapToInt(Integer::parseInt)
                .sorted()
                .toArray();

        if (validationTriangle(list)) {
            System.out.println("삼각형이 됩니다");
        } else {
            System.out.println("삼각형이 될 수 없습니다");
        }

        sc.close();
    }
    
    static boolean validationTriangle(int[] list) {
        return checkLength(list[0], list[1], list[2])
                && checkLength(list[1], list[0], list[2])
                && checkLength(list[2], list[0], list[1]);
    }

    static boolean checkLength(int a, int b, int c) {
        return a < b + c;
    }
}

 

[06]

369게임을 간단히 작성해보자. 1~99까지의 정수를 입력받고 정수에 3, 6, 9 중 하나가 있는 경우는 "박수짝"을 출력하고 두 개 있는 경우는 "박수짝짝"을 출력하는 프로그램을 작성하라. 예를 들면, 키보드로 입력된 수가 13인 경우 "박수짝"을, 36인 경우 "박수짝짝"을 출력하면 된다.

package chap02;

import java.util.Scanner;

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

        System.out.print("1 ~ 99 사이의 정수를 입력하세요 >> ");
        String num = sc.nextLine();

        if (getThreeSixNine(num) == 2) {
            System.out.println("박수짝짝");
        } else if (getThreeSixNine(num) == 1) {
            System.out.println("박수짝");
        } else {
            System.out.println("박수 X");
        }

        sc.close();
    }

    static int getThreeSixNine(String num) {
        int one = Integer.parseInt(num) % 10;
        int ten = Integer.parseInt(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;
    }
}

 

[07]

2차원 평면에서 직사각형은 왼쪽 상단 모서리와 오른쪽 하단 모서리의 두 점으로 표현한다. (100, 100)과 (200, 200)의 두 점으로 이루어진 사각형이 있을 때, Scanner를 이용하여 정수 x와 y값을 입력받고 점 (x, y)가 이 직사각형 안에 있는지를 판별하는 프로그램을 작성하라.

package chap02;

import java.util.Scanner;

public class Solution7 {

    static final int[] LEFT_XY = {100, 100};
    static final int[] RIGHT_XY = {200, 200};

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

        System.out.print("점 (x,y)의 좌표를 입력하세요 >> ");
        int x = sc.nextInt();
        int y = sc.nextInt();

        if (validationX(x) && validationY(y)) {
            System.out.println("(" + x + "," + y + ")는 사각형 안에 있습니다");
        } else {
            System.out.println("(" + x + "," + y + ")는 사각형 안에 없습니다");
        }

        sc.close();
    }

    static boolean validationX(int x) {
        return LEFT_XY[0] <= x && x <= RIGHT_XY[0];
    }

    static boolean validationY(int y) {
        return LEFT_XY[1] <= y && y <= RIGHT_XY[1];
    }
}

 

[08]

2차원 평면에서 직사각형은 문제 7번처럼 두 점으로 표현된다. 키보드로부터 직사각형을 구성하는 두 점 (x1, y1), (x2, y2)를 입력받아 (100, 100), (200, 200)의 두 점으로 이루어진 직사각형과 충돌하는지 판별하는 프로그램을 작성하라.

package chap02;

import java.util.Scanner;

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

        System.out.print("점 (x1,y1)의 좌표를 입력하세요 >> ");
        int x1 = sc.nextInt();
        int y1 = sc.nextInt();
        sc.nextLine();

        System.out.print("점 (x2,y2)의 좌표를 입력하세요 >> ");
        int x2 = sc.nextInt();
        int y2 = sc.nextInt();

        if (validationInner(x1, y1)) {
            if (validationInner(x2, y2)) { // 두 점 모두 사각형 내부에 존재
                System.out.println("충돌하지 않습니다");
            } else {
                System.out.println("충돌합니다");
            }
        } else {
            if (validationInner(x2, y2)) {
                System.out.println("충돌합니다");
            } else {
                System.out.println("완전히 포함하거나 충돌하지 않습니다");
            }
        }
        
        sc.close();
    }

    static boolean validationInner(int x, int y) {
        return 100 <= x && x <= 200
                && 100 <= y && y <= 200;
    }
}

 

[09]

원의 중심을 나타내는 한 점과 반지름을 실수 값으로 입력받아라. 그리고 실수 값으로 다른 점 (x, y)를 입력받아 이 점이 원의 내부에 있는지 판별하여 출력하라.

package chap02;

import java.util.Scanner;

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

        System.out.print("원의 중심과 반지름 입력 >> ");
        String[] info = sc.nextLine().strip().split(" ");

        System.out.print("점 입력 >> ");
        double x = sc.nextDouble();
        double y = sc.nextDouble();
        sc.nextLine();

        if (validation(info, x, y)) {
            System.out.println("점 (" + x + ", " + y + ")는 원 안에 있습니다");
        } else {
            System.out.println("점 (" + x + ", " + y + ")는 원 안에 없습니다");
        }

        sc.close();
    }
    
    static boolean validation(String[] info, double x, double y) {
        int cx = Integer.parseInt(info[0]);
        int cy = Integer.parseInt(info[1]);
        double r = Double.parseDouble(info[2]); // 반지름

        return validationX(cx - r, cx + r, x) && validationY(cy - r, cy + r, y);
    }

    static boolean validationX(double leftRange, double rightRange, double x) {
        return leftRange <= x && x <= rightRange;
    }

    static boolean validationY(double upRange, double downRange, double y) {
        return upRange <= y && y <= downRange;
    }
}

 

[10]

원의 정보를 받기 위해 키보드로부터 원의 중심을 나타내는 한 점과 반지름을 입력받는다. 두 개의 원을 입력받고 두 원이 서로 겹치는지 판단하여 출력하라.

package chap02;

import java.util.Scanner;

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

        System.out.print("첫번째 원의 중심과 반지름 입력 >> ");
        int x1 = sc.nextInt();
        int y1 = sc.nextInt();
        int r1 = sc.nextInt();
        sc.nextLine();

        System.out.print("두번째 원의 중심과 반지름 입력 >> ");
        int x2 = sc.nextInt();
        int y2 = sc.nextInt();
        int r2 = sc.nextInt();
        sc.nextLine();

        // 두 원의 중심간의 거리
        double rDistance = Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2));

        if (rDistance > r1 + r2) {
            System.out.println("두 원은 서로 겹치지 않습니다");
        } else if (rDistance < r1 + r2) {
            System.out.println("두 원은 서로 겹칩니다 (두 점)");
        } else {
            System.out.println("두 원은 완전히 겹칩니다 (한 점)");
        }

        sc.close();
    }
}

 

[11]

숫자를 입력받아 3~5는 "봄", 6~8은 "여름", 9~11은 "가을", 12,0,1의 경우 "겨울"을, 그 외 숫자를 입력한 경우 "잘못입력"을 출력하는 프로그램을 작성하라.

package chap02;

import java.util.Scanner;

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

        System.out.print("달을 입력하세요(1 ~ 12) >> ");
        int month = Integer.parseInt(sc.nextLine());

        ifElseType(month);
        switchType(month);

        sc.close();
    }

    // if-else문 사용
    static void ifElseType(int month) {
        System.out.print("[If-Else] -> ");

        if (3 <= month && month <= 5) {
            System.out.println("봄");
        } else if (6 <= month && month <= 8) {
            System.out.println("여름");
        } else if (9 <= month && month <= 11) {
            System.out.println("가을");
        } else if (month == 12 || month == 1 || month == 2) {
            System.out.println("겨울");
        } else {
            System.out.println("잘못입력");
        }
    }

    // switch문 사용
    static void switchType(int month) {
        System.out.print("[Switch] -> ");

        switch (month) {
            case 3, 4, 5 -> System.out.println("봄");
            case 6, 7, 8 -> System.out.println("여름");
            case 9, 10, 11 -> System.out.println("가을");
            case 12, 1, 2 -> System.out.println("겨울");
            default -> System.out.println("잘못입력");
        }
    }
}

 

[12]

사칙 연산을 입력받아 계산하는 프로그램을 작성하고자 한다. 연산자는 +, -, *, /의 네 가지로 하고 피연산자는 모두 실수로 한다. 피연산자와 연산자는 실행 사례와 같이 빈 칸으로 분리하여 입력한다. 0으로 나누기 시 "0으로 나눌 수 없습니다."를 출력하고 종료한다.

package chap02;

import java.util.Scanner;

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

        System.out.print("연산 >> ");
        String[] line = sc.nextLine().strip().split(" ");

        ifElseType(line);
        switchType(line);

        sc.close();
    }

    // if-else문
    static void ifElseType(String[] line) {
        int num1 = Integer.parseInt(line[0]);
        int num2 = Integer.parseInt(line[2]);
        String operator = line[1];

        System.out.print("[If-Else] -> ");
        if (operator.equals("+")) {
            System.out.println(num1 + " + " + num2 + "의 계산 결과 = " + (num1 + num2));
        } else if (operator.equals("-")) {
            System.out.println(num1 + " - " + num2 + "의 계산 결과 = " + (num1 - num2));
        } else if (operator.equals("*")) {
            System.out.println(num1 + " * " + num2 + "의 계산 결과 = " + (num1 * num2));
        } else {
            if (num2 == 0) {
                System.out.println("0으로 나눌 수 없습니다");
            } else {
                System.out.println(num1 + " / " + num2 + "의 계산 결과 = " + ((double) num1 / num2));
            }
        }
    }

    // switch문
    static void switchType(String[] line) {
        int num1 = Integer.parseInt(line[0]);
        int num2 = Integer.parseInt(line[2]);
        String operator = line[1];

        System.out.print("[Switch] -> ");
        switch (operator) {
            case "+":
                System.out.println(num1 + " + " + num2 + "의 계산 결과 = " + (num1 + num2));
                break;
            case "-":
                System.out.println(num1 + " - " + num2 + "의 계산 결과 = " + (num1 - num2));
                break;
            case "*":
                System.out.println(num1 + " * " + num2 + "의 계산 결과 = " + (num1 * num2));
                break;
            default:
                if (num2 == 0) {
                    System.out.println("0으로 나눌 수 없습니다");
                } else {
                    System.out.println(num1 + " / " + num2 + "의 계산 결과 = " + ((double) num1 / num2));
                }
                break;
        }
    }
}