본문 바로가기
학부공부/Java_Basic

Chapter 10. Object-Oriented Thinking(1)[Java Basic]

by sonpang 2021. 11. 6.
반응형

10.A - 내림차순 소인수 분해

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

사용자로부터 양의 정수 n을 입력받아, 내림차순으로 n의 소인수 분해 결과를 출력하는 프로그램을 작성하시오. 예를 들어 양의 정수 120이 주어졌을때 5 3 2 2 2로 소인수 분해 결과가 출력되어야 합니다.

(Displaying the prime factors) Write a program that prompts the user to enter a positive integer and displays all its smallest factors in decreasing order. For example, if the integer is 120, the smallest factors are displayed as 5, 3, 2, 2, 2. Use the StackOfIntegers class to store the factors (e.g., 2, 2, 2, 3, 5) and retrieve and display them in reverse order.

 

INPUT

* Line 1 : 테스트케이스 T (1~1,000)

* Line 2 ~ T+1 : 소인수 분해할 양의 정수 n (1~1,000,000)

 

OUTPUT

* Line 1 ~ T : 공백으로 구분된 내림차순 소인수 분해 결과

 

SAMPLE INPUT

3

3

10

120

 

SAMPLE OUTPUT

3

5 2

5 3 2 2 2

 

HINT

StackOfInteger 클래스를 사용하세요.

 

import java.util.Scanner;
import java.util.Stack;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i, j, data[] = new int[n], copy;
        Stack<Integer> s = new Stack();
        for(i = 0; i < n; i++)
            data[i] = input.nextInt();
        for(i = 0; i < n; i++){
            copy = data[i];
            for(j = 2; copy != 1; j++){
                while(copy % j == 0){
                    s.push(j);
                    copy /= j;
                }
            }
            System.out.print(s.pop());
            while(s.empty()==false)
                System.out.print(" " + s.pop());
            System.out.println();
        }
    }
}

 

10.B - 게임: ATM 기계

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

JAVA2015 PE10.7에 만든 Account 클래스를 활용해서 ATM 기계를 만들어 보자. ATM 기계는 전원이 들어오는 것과 동시에 0, 1, . . . , 9의 id를 가지는 10개의 account 생성하고, 초기 잔액으로 $100를 넣어준다. ATM 기계의 시스템은 사용자에게 account id를 요구한다. 만약 잘못된 id가 입력되면, 다시 입력할 것을 요구한다. id가 타당하다면 시스템은 사용자에게 다음 4가지 메뉴를 제공한다.

 

현재 id의 잔액을 소수점 한자리로 반올림해서 보여준다.

돈을 인출한다. 현재 잔액보다 더 많은 돈을 인출하려고 하면 메세지를 보여주며 무시한다.

돈을 입금한다. -금액을 입금하려고 하면 메세지를 보여주며 무시한다.

메뉴를 나간다

4가지 선택중 다른 선택을 하려고 하면 메세지를 보여주며 재입력을 요청한다. 시스템은 항상 켜있어야 하므로 id 입력단계에서 종료코드 -20150901이 들어오기 전까지 계속 반복되어야 한다.

 

 

 

힌트1: 이 문제에서는 인출값의 음수는 처리하고 있지 않습니다.

 

힌트2: "Wrong choice, try again: " 끝에 공백이 한 칸 있습니다.

 

Use the Account class created in Programming Exercise 9.7 to simulate an ATM machine. Create ten accounts in an array with id 0, 1, . . . , 9, and initial balance $100. The system prompts the user to enter an id. If the id is entered incorrectly, ask the user to enter a correct id. Once an id is accepted, the main menu is displayed as shown in the sample run. You can enter a choice 1 for viewing the current balance, 2 for withdrawing money, 3 for depositing money, and 4 for exiting the main menu. Once you exit, the system will prompt for an id again. Thus, once the system starts, it will not stop until get exit code -20150901.

 

INPUT

* 마지막 수를 제외하고, 모든 입력값은 정수이며 절대값은 100을 넘지 않는다

 

* 잔액이 int의 범위를 넘는 경우는 없다

 

* 프로그램이 종료되지 않는 경우는 없다

 

OUTPUT

Input에 따른 Output의 예는 다음줄 부터 시작된다. Input은 이탤릭 처리되어 있다.

Enter an id: 4

 

Main menu

1: check balance

2: withdraw

3: deposit

4: exit

Enter a choice: 1

The balance is 100.0

 

Main menu

1: check balance

2: withdraw

3: deposit

4: exit

Enter a choice: 2

Enter an amount to withdraw: 4

 

Main menu

1: check balance

2: withdraw

3: deposit

4: exit

Enter a choice: 1

The balance is 96.0

 

Main menu

1: check balance

2: withdraw

3: deposit

4: exit

Enter a choice: 2

Enter an amount to withdraw: -1

 

Main menu

1: check balance

2: withdraw

3: deposit

4: exit

Enter a choice: 1

The balance is 97.0

 

Main menu

1: check balance

2: withdraw

3: deposit

4: exit

Enter a choice: 3

Enter an amount to deposit: 10

 

Main menu

1: check balance

2: withdraw

3: deposit

4: exit

Enter a choice: 1

The balance is 107.0

 

Main menu

1: check balance

2: withdraw

3: deposit

4: exit

Enter a choice: 4

 

Enter an id: 11

Please enter a correct id

Enter an id: 10

Please enter a correct id

Enter an id: 1

...

 

class Account{
    private int id;
    private double balance;
    Account(int inputid, double inputbalance ){
        id = inputid;
        balance = inputbalance;
    }
    public double getBalance(){
        return balance;
    }
    public void deposit(double input){
        if(input < 0){
            System.out.println("The amount is negative, ignored");
            return;
        }
        balance += input;
    }
    public void withdraw(double output){
        if(output > balance){
            System.out.println("The amount is too large, ignored");
            return;
        }
        balance -= output;
    }
}
반응형

 

Wrong Answer 0
class Account{
    private int id;
    private double balance;
    Account(int inputid, double inputbalance ){
        id = inputid;
        balance = inputbalance;
    }
    public double getBalance(){
        return balance;
    }
    public void deposit(double input){
        if(input < 0){
            System.out.println("The amount is negative, ignored");
            return;
        }
        balance += input;
    }
    public void withdraw(double output){
        if(output > balance){
            System.out.println("The amount is too large, ignored");
            return;
        }
        balance -= output;
    }
}

AND
class Account{
    private int id;
    private double balance;
    Account(int inputid, double inputbalance ){
        id = inputid;
        balance = inputbalance;
    }
    public double getBalance(){
        return balance;
    }
    public void deposit(double input){
        if(input < 0){
            System.out.println("The amount is negative, ignored");
            return;
        }
        balance += input;
    }
    public void withdraw(double output){
        if(output > balance){
            System.out.println("The amount is too large, ignored");
            return;
        }
        balance -= output;
    }
}

 

 

10.C - 기하: MyRectangle2D 클래스

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

다음 내용을 포함하는 MyRectangle2D를 만들어 보자.

직사각형의 중심의 좌표를 나타내는 두 double형의 x와 y필드를 설정하고 반환하는 method를 가진다. (직사각형의 변은 x와 y축에 평행하다고 가정한다.)

너비와 높이를 설정하고 반환하는 method를 가진다.

직사각형의 x, y를 각각 (0, 0), 너비와 높이를 각각 1로 만드는 무(無)인자(no-arg)생성자를 가진다.

x, y, 너비, 높이를 설정하는 생성자를 가진다.

사각형의 넓이를 반환하는 getArea() 메소드를 가진다.

사각형의 둘레를 반환하는 getPerimeter() 메소드를 가진다.

특정한 점(x, y)가 이 직사각형 안에 있으면 true를 반환하는 contains(double x, double y) 메소드를 가진다. (Figure 10.24a)

특정한 직사각형이 이 직사각형 안에 있으면 true를 반환하는 contains(MyRectangle2D r) 메소드를 가진다. (Figure 10.24b)

특정한 직사각형이 이 직사각형과 겹치면 true를 반환하는 overlaps(MyRectangle2D r) 메소드를 가진다. (Figure 10.24c)

Define the MyRectangle2D class that contains:

 

Two double data fields named x and y that specify the center of the rectangle with getter and setter methods. (Assume that the rectangle sides are parallel to x- or y- axes.)

The data fields width and height with getter and setter methods.

A no-arg constructor that creates a default rectangle with (0, 0) for (x, y) and 1 for both width and height.

A constructor that creates a rectangle with the specified x, y, width, and height.

A method getArea() that returns the area of the rectangle.

A method getPerimeter() that returns the perimeter of the rectangle.

A method contains(double x, double y) that returns true if the specified point (x, y) is inside this rectangle (see Figure 10.24a).

A method contains(MyRectangle2D r) that returns true if the specified rectangle is inside this rectangle (see Figure 10.24b).

A method overlaps(MyRectangle2D r) that returns true if the specified rectangle overlaps with this rectangle (see Figure 10.24c).

 

여러분이 작성한 코드는 아래 샘플코드의 YOUR_CODE 부분에 들어가 컴파일 됩니다.

 

INPUT

* Line 1 : 테스트케이스 T (1~1,000)

* Line 2 ~ T+1 : x1 y1 w1 h1 x2 y2 w2 h2 x3 y3 (공백으로 구분된 10개의 실수)

- 실수의 범위는 -100 ~ 100

- 사각형의 width와 height의 범위는 1~100

- x1 y1 w1 h1는 사각형 r1의 정점

- x2 y2 w2 h2는 사각형 r2의 정점

- x3 y3는 정점 p

 

OUTPUT

* Line 1 ~ 4T : 각 테스트 케이스마다 샘플 출력과 같이 4줄씩 출력

- Line 3 : r1이 p를 포함하면 true 아니라면 false

- Line 4 : r1이 r2를 포함하면 contain, r1와 r2가 겹치면 overlaps, 만나지 않는다면 no overlap을 출력

 

SAMPLE CODE

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

        int T = sc.nextInt();
        for (int t = 0; t < T; t++) {
            double x1, y1, x2, y2, x3, y3, x4, y4, x5, y5;
            x1 = sc.nextDouble();
            y1 = sc.nextDouble();
            x2 = sc.nextDouble();
            y2 = sc.nextDouble();
            x3 = sc.nextDouble();
            y3 = sc.nextDouble();
            x4 = sc.nextDouble();
            y4 = sc.nextDouble();
            x5 = sc.nextDouble();
            y5 = sc.nextDouble();

            MyRectangle2D r1 = new MyRectangle2D(x1, y1, x2, y2);
            MyRectangle2D r2 = new MyRectangle2D(x3, y3, x4, y4);

            System.out.printf("Area is %.1f\n", r1.getArea());
            System.out.printf("Perimeter is %.1f\n", r1.getPerimeter());
            System.out.println(r1.contains(x5, y5));
            if (r1.contains(r2)) {
                System.out.println("contain");
            } else if (r1.overlaps(r2)) {
                System.out.println("overlaps");
            } else {
                System.out.println("no overlap");
            }
        }
    }
}

 

YOUR_CODE

SAMPLE INPUT

3

0 0 3 3 0 0 1 1 3 0

0 0 2 2 2 0 2 2 1 0

0 0 2 2 2 2 2 2 1 0

SAMPLE OUTPUT

Area is 9.0

Perimeter is 12.0

false

contain

Area is 4.0

Perimeter is 8.0

true

overlaps

Area is 4.0

Perimeter is 8.0

true

overlaps

 

class MyRectangle2D{
    private double x, y, w, h;
    MyRectangle2D(double X, double Y, double W, double H){
        x = X;
        y = Y;
        w = W;
        h = H;
    }
    MyRectangle2D(){
        x = y = 0;
        w = h = 1;
    }
    public double getArea(){
        return w*h;
    }
    public double getPerimeter(){
        return (w + h) * 2;
    }
    public boolean contains(double ix, double iy){
        if(ix <= x + w / 2 && ix >= x - w / 2 && iy <= y + h / 2 && iy >= y - h / 2)
            return true;
        return false;
    }
    public boolean contains(MyRectangle2D r){
        if((r.x <= x + (w + r.w) / 2 && r.x >= x - (w + r.w) / 2) && (r.y <= y + (h + r.h) / 2 && r.y >= y - (h + r.h) / 2) && (r.x <= x + (w - r.w) / 2 && r.x >= x - (w - r.w) / 2) && (r.y <= y + (h - r.h) / 2 && r.y >= y - (h - r.h) / 2))
            return true;
        return false;
    }
    public boolean overlaps(MyRectangle2D r){
        if((r.x <= x + (w + r.w) / 2 && r.x >= x - (w + r.w) / 2) && (r.y <= y + (h + r.h) / 2 && r.y >= y - (h + r.h) / 2))
            return true;
        return false;
    }
}

 

 

반응형

댓글