본문 바로가기
Algorithm/명품 JAVA 에센셜

명품 JAVA 에센셜 2장 실습 문제 풀이

by 준그래머 2023. 11. 28.
반응형

1. 두 정수를 입력받아 합을 구하여 출력하는 프로그램을 작성하라.

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

    int a, b;
    a = sc.nextInt();
    b = sc.nextInt();

    System.out.println(a + " + " + b + " = " + (a+b));
    
    sc.close();
}

Scanner 클래스를 이용할 수 있는지에 대해 알아보기 위한 문제였습니다. 먼저 Scanner 클래스의 객체 sc를 생성해 줍니다.그 뒤에 nextInt()를 이용하여 정수를 입력받은 뒤 형식에 맞게 출력해 주면 됩니다.

 

 

2. 2차원 평면에서 하나의 직사각형은 두 점으로 표현된다. (50,50)과 (100,100)의 두 점으로 이루어진 사각형이 있다고 하자. 한 점을 구성하는 정수 x와 y의 값을 입력받고 점 (x, y)가 이 직사각형 안에 있는지 판별하는 프로그램을 작성하라.

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

        int x, y;
        x = sc.nextInt();
        y = sc.nextInt();
        
        if((x>=50 && x <= 100) && (y >= 50 && y <= 100)){
            System.out.println("점(" + x + "," + y + ")은 (50, 50)과 (100,100) 사각형 내에 있습니다.");
        }
        else{
            System.out.println("점(" + x + "," + y + ")은 (50, 50)과 (100,100) 사각형 내에 없습니다.");
        }
        sc.close();
    }

 

 

3. 다음과 같이 AND와 OR의 논리 연산을 입력받아 결과를 출력하는 프로그램을 작성하라
    (단, if 문 대신 switch 문을 이용하라)

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

    System.out.print("논리 연산을 입력하세요>>");
    int flag = 1;
    String bool;
    bool = sc.nextLine();
    sc.close();

    String[] boolArr = bool.split(" ");
    String prevOp = "";
    for(int i = 0; i < boolArr.length; i++){
        if(boolArr[i].contentEquals("and") || boolArr[i].contentEquals("or")) {
            prevOp = boolArr[i];
        }
        else{
            try {
                boolean vf = Boolean.parseBoolean(boolArr[i]);
                if(!vf && prevOp.contentEquals("and")){
                    flag = 0;
                    break;
                }
            }
            catch(Exception e){
                e.printStackTrace();
                continue;
            }
        }
    }

    switch(flag){
        case 0:
            System.out.println("false");
            break;
        case 1:
            System.out.println("true");
            break;
    }
}

먼저 문자열을 입력 받아야하는데, nextLint() 함수를 이용해 입력받아야 합니다. next() 함수의 경우 띄어쓰기가 들어간 문자열을 입력받으면 띄어쓰기를 기준으로 한 개의 입력으로 인식합니다. ex) true and false는 true, and, false 총 세 개의 입력으로 인식합니다. 먼저 nextLine()을 통해 입력 받도록 합니다.

입력받는 문자열의 형식은 true or false 또는 false and true와 같은 방식으로 입력받습니다. 때문에 띄어쓰기를 기준으로 String 배열을 만들 수 있다는 것을 알 수 있습니다. 배열로 만든 뒤에 for문을 통해 "and" 또는 "or"인 경우 prevOp에 이전 조건으로 미리 저장해둡니다. 아닌 경우 boolean 값으로 파싱 해주고 그 값이 false 라면 이전 조건이 "and" 였는지 확인해 줍니다. 만약 false면서 and였다면 for문 break 후 flag를 0으로 초기화합니다.

초기화된 flag는 swich문으로 0 또는 1인 경우에 맞게 출력해 줍니다. 여기서 switch문을 왜 써야 하는지 모르겠어서 억지로 쓰긴 했습니다...

 

 

4. 돈의 액수를 입력받아 오만 원권, 만 원권, 천 원권 500원짜리 동전, 100원짜리 동전, 10원짜리 동전, 1원짜리 동전 각 몇 개로 변환되는지 출력하라.

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

    System.out.print("돈의 액수를 입력하세요>>");
    int money = sc.nextInt();
    sc.close();
    int m50000 = money / 50000;
    int m10000 = (money-m50000*50000)/10000;
    int m1000  = (money-m50000*50000-m10000*10000)/1000;
    int m500   = (money-m50000*50000-m10000*10000-m1000*1000)/500;
    int m100   = (money-m50000*50000-m10000*10000-m1000*1000-m500*500)/100;
    int m10    = (money-m50000*50000-m10000*10000-m1000*1000-m500*500-m100*100)/10;
    int m1     = money-m50000*50000-m10000*10000-m1000*1000-m500*500-m100*100-m10*10;
    System.out.printf("오만원%2d장, 만원%2d장, 천원%2d개, 오백원%2d개, 백원%2d개, 십원%2d개, 일원%2d개", 
        m50000, m10000, m1000, m500, m100, m10, m1);
}

내림차순으로 하나씩 구하면서 내려가면 됩니다.

 

 

5.  학점이 A, B 이면 "Excellent", 학점이 C, D 이면 "Good", 학점이 F 이면 "Bye"라고 출력하는 프로그램을 작성하라.(단, switch와 break를 활용하라)

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

    System.out.print("학점을 입력하세요>>");
    String grade = sc.next();
    sc.close();

    switch(grade){
        case "A":
        case "B":
            System.out.println("Excellent");
            break;
        case "C":
        case "D":
            System.out.println("Good");
            break;
        default:
            System.out.println("Bye");
            break;
    }
}

switch 문을 이용해 A와 B를 C와 D를 묶어 출력하고 나머지는 F라고 생각하고 default 조건으로 넣어주면 됩니다.

 

 

6. 369게임의 일부를 작성해 보자. 1~99까지의 정수를 입력받고 수에 3, 6, 9 중 하나가 있는 경우는 "박수짝" 두 개가 있는 경우는 "박수 짝짝", 하나도 없으면 "박수없음"을 출력하는 프로그램을 작성하라.

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

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

    int[] numArr = new int[] {num/10, num%10};
    int count = 0;
    for(int i = 0; i < numArr.length; i++){
        if(numArr[i] == 3 || numArr[i] == 6 || numArr[i] == 9) count++;
    }
    switch(count){
        case 0: 
            System.out.println("박수없음");
            break;
        case 1: 
            System.out.println("박수짝");
            break;
        case 2:
            System.out.println("박수짝짝");
            break;
        default:

    }
}

입력받은 정수를 10으로 나누고 10으로 나눈 나머지를 각 각 배열에 담아 줍니다. 배열에 담긴 값들을 for문을 통해 3,6 또는 9인지 확인하고 맞다면 count를 1 증가시킵니다.

count를 swich문에 넣고 박수의 개수에 따라 출력합니다.

 

 

Bonus 1 사칙 연산을 입력받아 실행해 주는 프로그램을 작성하고자 한다. 이때 연산자는 +, -, *, /의 4가지로 하고 피연산자는 모두 실수이며, 다음과 같이 피연산자와 연산자는 빈칸으로 분리하여 입력하는 것으로 한다.

ex) 32.3 + 3    16.6 - 20.3     5 * 2.1    6 / 3 

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

    System.out.print("연산을 입력하세요>>");
    String exp = sc.nextLine();
    sc.close();

    String[] expArr = exp.split(" ");
    double exp1 = Double.parseDouble(expArr[0]);
    double exp2 = Double.parseDouble(expArr[2]);
    switch(expArr[1]){
        case "+": 
            System.out.println(exp1 + expArr[1] + exp2 + "=" + (exp1+exp2));
            break;
        case "-": 
            System.out.println(exp1 + expArr[1] + exp2 + "=" + (exp1-exp2));
            break;
        case "*":
            System.out.println(exp1 + expArr[1] + exp2 + "=" + (exp1*exp2));
            break;
        case "/":
            System.out.println(exp1 + expArr[1] + exp2 + "=" + (exp1/exp2));
            break;
        default:
    }
}

이전 문제들을 푼 것과 동일합니다.

 

 

Open Challenge 두 사람이 하는 가위바위보 게임을 만들어보자. 두 사람의 이름은 '철수'와 '영희'이다. 먼저 "철수"를 출력하고 "가위", "바위", "보" 중 하나를 문자열로 입력받는다. "영희"에 대해서 마찬가지 방법으로 입력받는다. 두 사람으로부터 문자열을 입력받은 후 누가 이겼는지 판별하여 승자를 출력한다.

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("가위바위보 게임입니다. 가위, 바위, 보 중 하나를 입력하세요.");
    System.out.print("철수>>");
    String cs = sc.next();
    System.out.print("영희>>");
    String yh = sc.next();
    sc.close();

    if(cs.contentEquals(yh)) System.out.println("비겼습니다.");
    else{
        if((cs.contentEquals("가위") && yh.contentEquals("보")) || (cs.contentEquals("바위") && yh.contentEquals("가위")) 
            || (cs.contentEquals("보") && yh.contentEquals("바위"))){
                System.out.println("철수가 이겼습니다.");
        }
        else{
            System.out.println("영희가 이겼습니다.");
        }
    }
}

철수와 영희를 각 각 입력받은 뒤에 값이 같으면 비긴 것으로 출력합니다. 값이 다른 경우 철수가 이기는 조건을 기준으로 각 각 이기는 경우의 출력 값을 넣어줍니다.