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

Chapter 3. Selections[Java Basic]

by sonpang 2021. 11. 5.
반응형

3.A - 대수: 2차방정식 풀이

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

2차 방정식의 해는 다음 공식을 통해서 구할 수 있습니다.

The two roots of a quadratic equation ax^2 + bx + c = 0 can be obtained using the following formula:

 

위 식에서 b^2-4ac 는 2차방정식의 판별식이라고 합니다. 만약 2차 방정식의 판별식이 0보다 크다면 2개의 실수해를 가지고, 0이라면 1개의 실수해를 가지고, 0보다 작다면 0개의 실수해를 가집니다. a, b, c의 값을 입력으로 받아 해를 출력하는 프로그램을 작성하세요.

b^2-4ac is called the discriminant of the quadratic equation. If it is positive, the equation has two real roots. If it is zero, the equation has one root. If it is negative, the equation has no real roots. Write a program that prompts the user to enter values for a, b, and c and displays the result based on the discriminant.

 

INPUT

* Line 1 : 실수 a (범위는 -100~100 이고 0이 아님)

* Line 2 : 실수 b (범위는 -100~100)

* Line 3 : 실수 c (범위는 -100~100)

 

OUTPUT

* Line 1 : 두개의 실수해 중에서 큰 값을 출력 (소수점 첫째자리에서 내림. 실수해가 없을 경우 숫자출력 대신 complex 라는 문자열만 출력. 예: 11.713는 11.7로 출력, 11.0는 11.0로 출력, -2.61는 -2.7로 출력)

 

SAMPLE INPUT

1

3

1

 

SAMPLE OUTPUT

-0.4

 

HINT

Math.pow(x, 0.5)

소수점 한자리까지 출력 System.out.printf("%.1f\n", 0.6789);

 

import java.util.Scanner;
import java.lang.Math;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Double a = input.nextDouble(), b = input.nextDouble(), c = input.nextDouble();
        if(Math.pow(b, 2) - 4 * a * c < 0)
            System.out.println("complex");
        else if(a > 0)
            System.out.println(Math.floor((-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a) * 10)/10.0);
        else
            System.out.println(Math.floor((-b - Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a) * 10)/10.0);
    }
}

 

 

3.B - 대수: 2 * 2 선형 방정식 풀이

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

선형 방정식의 해는 다음 Cramer's rule를 이용해 구할 수 있습니다.

A linear equation can be solved using Cramer's rule using the following formula:

 

사용자로부터 a, b, c, d, e, f를 입력받아 x, y를 구하는 프로그램을 작성하세요. 만약 해가 존재하지 않을 경우 "no solution"이라고 출력하세요.

Write a program that prompts the user to enter a, b, c, d, e, and f and displays the result. If ad - bc is 0, report that "no solution"

 

INPUT

* Line 1 : 6개의 실수 a, b, c, d, e, f가 순차적으로 공백으로 구분되어 있음

 

OUTPUT

* Line 1 : x, y값중 큰 수부터 공백으로 구분해서 출력(1의자리 자리 아래는 버림. 예: 11.713는 11, 11.0은 11, -1.5은 -1 으로 출력)하고 값이 없을 경우 no solution 문자열을 출력

 

SAMPLE INPUT

9.0 4.0 3.0 -5.0 –6.0 -21.0

 

SAMPLE OUTPUT

3 -2

 

import java.util.Scanner;
import java.lang.Math;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Double a = input.nextDouble(), b = input.nextDouble(), c = input.nextDouble(), d = input.nextDouble(), e = input.nextDouble(), f = input.nextDouble();
        Double discriminant = a * d - b * c;
        int x = (int)((e * d - b * f) / discriminant), y = (int)((a * f - e * c) / discriminant);
        if(discriminant == 0)
            System.out.println("no solution");
        else
            System.out.printf("%d %d\n", (x > y) ? x : y, (x > y) ? y : x);
    }
}

Wrong Answe
int x = (int)Math.floor((e * d - b * f) / discriminant), y = (int)Math.floor((a * f - e * c) / discriminant);

버림 내림 출력 구분하기

 

3.C - 경제: ISBN-10 검증

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

ISBN-10 (International Standard Book Number)은 10자리 숫자로 되어 있습니다. ISBN-10의 각 숫자를 차례대로 d1d2d3d4d5d6d7d8d9d10 라고 했을때, 마지막 숫자 d10 은 앞의 9개의 숫자를 다음 공식에 넣어서 구한 값입니다.

An ISBN-10 (International Standard Book Number) consists of 10 digits: d1d2d3d4d5d6d7d8d9d10. The last digit, d10, is a checksum, which is calculated from the other nine digits using the following formula:

 

만약 위 식을 통해서 구한 값이 10이라면 ISBN-10 전통에 따라 마지막 숫자는 X로 표기합니다. 사용자로부터 10-digit ISBN의 9개 숫자를 입력으로 받아, d10의 값을 계산하는 프로그램을 작성하세요.

If the checksum is 10, the last digit is denoted as X according to the ISBN-10 convention. Write a program that prompts the user to enter the first 9 digits and displays the 10-digit ISBN (including leading zeros). Your program should read the input as an integer.

 

INPUT

* Line 1 : ISBN의 9개의 숫자

 

OUTPUT

* Line 1 : ISBN-10 문자열

 

SAMPLE INPUT

013601267

 

SAMPLE OUTPUT

0136012671

 

import java.util.Scanner;
import java.lang.Math;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String isbn = input.nextLine();
        int i, ncopy = Integer.parseInt(isbn), x = 0;
        for(i = 9; i > 0; i--, ncopy /= 10)
            x += ncopy % 10 * i;
        x %= 11;
        if(x == 10)
            isbn += "X";
        else
            isbn += x;
        System.out.println(isbn);
    }
}

 

 

3.D - 과학: 날짜로 요일계산

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

Zeller’s congruence는 날짜의 요일을 계산하기 위해서 Christian Zeller에 의해서 고안된 알고리즘이며 그 식은 다음과 같습니다. 식에서 모든 분수 계산은 버림으로 수행 되어야 하므로 주의해야 합니다.

Zeller’s congruence is an algorithm developed by Christian Zeller to calculate the day of the week. The formula is

사용자로부터 년도, 월, 일로 구성된 날짜을 입력받아 해당 날짜는 무슨 요일인이 출력하는 프로그램을 작성하세요.

Note that the division in the formula performs an integer division. Write a program that prompts the user to enter a year, month, and day of the month, and displays the name of the day of the week.

 

INPUT

* Line 1 : year (1500~2500)

* Line 2 : month (1-12)

* Line 3 : day (1-31)

 

OUTPUT

* Line 1 : 해당 날짜에 해당되는 요일(Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday)

 

SAMPLE INPUT

2015

1

25

 

SAMPLE OUTPUT

Sunday

 

HINT

January and February are counted as 13 and 14 in the formula, so you need to convert the user input 1 to 13 and 2 to 14 for the month and change the year to the previous year

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int y = input.nextInt(), m = input.nextInt(), d = input.nextInt();
        String data[]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
        if(m < 3){
            m += 12;
            y--;
        }
        int j = y / 100, k = y % 100;
        int h = (d + 26 * (m + 1) / 10 + k + k / 4 + j / 4 + 5 * j) % 7;
        System.out.println(data[h]);
    }
}
반응형

3.E - 기하: 사각형안의 점

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

중심이 (0, 0)이고 너비가 10, 높이가 5인 사각형이 주어져 있을때 입력받은 점 (x, y)가 해당 사각형 안에 포함되는지 안되는지 체크하는 프로그램을 작성하려고 합니다. 예를 들어, (2, 2)는 사각형 안에 포함되어 있으므로 in을 출력하고 (6, 4)는 사각형 밖에 있으므로 out을 출력하면 됩니다. 점이 사각형의 선분에 있을 경우에는 on을 출력합니다.

Write a program that prompts the user to enter a point (x, y) and checks whether the point is within the rectangle centered at (0, 0) with width 10 and height 5. For example, (2, 2) is inside the rectangle and (6, 4) is outside the rectangle, as shown in Figure 3.7b.

 

INPUT

* Line 1 : 점의 좌표 x y (x, y는 절대값이 1000을 넘지 않는 실수이며 공백으로 구분됨)

 

OUTPUT

* Line 1 : 점이 사각형 안에 있으면 in, 사각형의 변 위에 있으면 on, 사각형 밖에 있으면 out을 출력

 

SAMPLE INPUT

6 4

 

SAMPLE OUTPUT

out

 

HINT

A point is in the rectangle if its horizontal distance to (0, 0) is less than or equal to 10 / 2 and its vertical distance to (0, 0) is less than or equal to 5.0 / 2. Test your program to cover all cases.

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Double x = input.nextDouble(), y = input.nextDouble();
 
        if(x <= 5 && y <= 2.5 && x >= -5 && y >= -2.5){
            if(x == 5 || y == 2.5 || x == -5 || y == -2.5)
                System.out.println("on");
            else
                System.out.println("in");
        }
        else
            System.out.println("out");
    }
}



3.F - 기하: 두 선분의 교점

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

(x1, y1)과 (x2, y2)을 지나는 직선 1과 (x3, y3)과 (x4, y4)를 지나는 직선 2가 있을때, 서로 다른 두 직선의 교점은 다음 선형 방정식을 통해서 계산 할 수 있다.

Two points on line 1 are given as (x1, y1) and (x2, y2) and on line 2 as (x3, y3) and (x4, y4), as shown in Figure 3.8a–b. The intersecting point of the two lines can be found by solving the following linear equation:

 

위 선형 방정식의 해는 "4326 - 대수: 2 * 2 선형 방정식 풀이" 문제에서 사용한 Cramer's rule 을 통해 계산 할 수 있다. 만약 선형 방정식의 해가 존재하지 않는다면 두 직선은 평행한 것이다. 당신은 2개의 직선을 나타내는 4개의 점을 입력받아 두 직선의 교점을 출력하는 프로그램을 작성하려고 한다.

This linear equation can be solved using Cramer's rule (see Programming Exercise 3.3). If the equation has no solutions, the two lines are parallel. Write a program that prompts the user to enter four points and displays the intersecting point.

INPUT

* Line 1 : 첫번째 선의 좌표 x1 y1 x2 y2 (각각 실수이며 공백으로 구분됨)

* Line 2 : 두번째 선의 좌표 x3 y3 x4 y4 (각각 실수이며 공백으로 구분됨)

두 직선은 서로 다른 직선이다.

 

OUTPUT

* Line 1 : x y 값을 출력 (소수점 첫째자리에서 버림, 예: 11.263의 경우 11.2로 출력하고 11.0의 경우 11.0로 출력, -11.256의 경우 -11.2로 출력 두 직선이 만나지 않을 경우 parallel출력)

 

SAMPLE INPUT

2 2 7 6

4 2 –1 -2

 

SAMPLE OUTPUT

parallel

 

HINT

소수점 한자리까지 출력 System.out.printf("%.1f\n", 0.6789);

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Double x1 = input.nextDouble(), y1 = input.nextDouble(), x2 = input.nextDouble(), y2 = input.nextDouble();
        Double x3 = input.nextDouble(), y3 = input.nextDouble(), x4 = input.nextDouble(), y4 = input.nextDouble();
        Double a = y1 - y2, b = x2 - x1, c = y3 - y4, d = x4 - x3, e = a * x1 + b * y1, f = c * x3 + d * y3;
        Double discriminant = a * d - b * c;
        if(discriminant == 0)
            System.out.println("parallel");
        else{
            Double x = (e * d - b * f) / discriminant, y = (a * f - e * c) / discriminant;
            System.out.println((int)(x * 10) / 10.0 + " " + (int)(y * 10) / 10.0);
        }
    }
}

Wrong Answer
import java.util.Scanner;
import java.lang.Math;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Double x1 = input.nextDouble(), y1 = input.nextDouble(), x2 = input.nextDouble(), y2 = input.nextDouble();
        Double x3 = input.nextDouble(), y3 = input.nextDouble(), x4 = input.nextDouble(), y4 = input.nextDouble();
        Double a = y1 - y2, b = x2 - x1, c = y3 - y4, d = x4 - x3, e = a * x1 + b * y1, f = c * x3 + d * y3;
        Double discriminant = a * d - b * c;
        if(discriminant == 0)
            System.out.println("parallel");
        else{
            Double x = (e * d - b * f) / discriminant, y = (a * f - e * c) / discriminant;
            System.out.println(Math.floor(x * 10) / 10.0 + " " + Math.floor(y * 10) / 10.0);
        }
    }
}



3.G - 기하: 삼각형안의 점

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

아래 그림처럼 삼각형이 평면위에 있다. 삼각형의 한 정점은 원점 (0, 0)에 위치하고 나머지 두 정점은 (200, 0)와 (0, 100)에 위치한다. 여러분은 x, y 좌표를 입력으로 받아 해당 좌표가 삼각형 내부에 있는지 외부에 있는지 판단하는 프로그램을 작성해야 한다. (기존 문제는 이렇지만 쫌더 어렵게 하기 위해) 단, 입력받은 좌표는 삼각형의 왼쪽 또는 아래에 있을 수 도 있기 때문에 주의 해야 한다. 또한 삼각형의 변에 좌표가 위치할 수 도 있다.

Suppose a right triangle is placed in a plane as shown below. The right-angle point is placed at (0, 0), and the other two points are placed at (200, 0), and (0, 100). Write a program that prompts the user to enter a point with x- and y-coordinates and determines whether the point is inside the triangle.

INPUT

* Line 1 : 점의 좌표 x y (x, y는 절대값이 200보다 작은 실수이며 공백으로 구분됨)

 

OUTPUT

* Line 1 : 점이 삼각형 안에 있으면 in, 삼각형의 변 위에 있으면 on, 삼각형 밖에 있으면 out을 출력

 

SAMPLE INPUT

100.5 25.5

 

SAMPLE OUTPUT

in

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Double x = input.nextDouble(), y = input.nextDouble();
        if(x >=0 && y >= 0 && x <= 200 && y<= 100){
            if(x == 0 || y == 0 || x + 2 * y == 200)
                System.out.println("on");
            else if(x + 2 * y < 200)
                System.out.println("in");
            else
                System.out.println("out");
        }
        else
            System.out.println("out");
    }
}



3.H - 기하: 두개의 사각형

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

두개의 사각형의 중심좌표(x, y)와 길이 w와 높이 h를 입력받아, 두번째 사각형이 첫번째 사각형에 포함되는지 겹치는지 또는 아무 관계가 아닌지 판단하는 프로그램을 작성하세요.

Write a program that prompts the user to enter the center x-, y-coordinates, width, and height of two rectangles and determines whether the second rectangle is inside the first or overlaps with the first, as shown in Figure 3.9. Test your program to cover all cases.

 

INPUT

* Line 1 : x1 y1 w1 h1

- x1, y1는 첫번째 사각형의 중심좌표이고 w1 h1은 첫번째 사각형의 너비와 높이

- x1, y1는 절대값이 100보다 작은 실수이고 w1, h1은 100보다 작은 실수

* Line 2 : x2 y2 w2 h2

- x2, y2는 두번째 사각형의 중심좌표이고 w2 h2은 두번째 사각형의 너비와 높이

- x2, y2는 절대값이 100보다 작은 실수이고 w2, h2은 100보다 작은 실수

- w1은 w2보다 크거나 같고 h1은 h2보다 크거나 같다

 

OUTPUT

* Line 1 : 두번째 사각형이 첫번째 사각형 안에 있으면 inside, 그 외에 첫번째 사각형과 접하거나 겹치는 면이 존재하면 attach, 그 외에 첫번째 사각형 밖에 있으면 outside를 출력 (만약에 inside, attach 조건이 동시에 만족할 경우 inside로 출력)

 

SAMPLE INPUT

2.5 4 2.5 43

1.5 5 0.5 3

 

SAMPLE OUTPUT

inside

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Double x1 = input.nextDouble(), y1 = input.nextDouble(), w1 = input.nextDouble(), h1 = input.nextDouble();
        Double x2 = input.nextDouble(), y2 = input.nextDouble(), w2 = input.nextDouble(), h2 = input.nextDouble();
        if((x2 <= x1 + (w1 + w2) / 2 && x2 >= x1 - (w1 + w2) / 2) && (y2 <= y1 + (h1 + h2) / 2 && y2 >= y1 - (h1 + h2) / 2)){
            if((x2 <= x1 + (w1 - w2) / 2 && x2 >= x1 - (w1 - w2) / 2) && (y2 <= y1 + (h1 - h2) / 2 && y2 >= y1 - (h1 - h2) / 2))
                System.out.println("inside");
            else
                System.out.println("attach");
        }
        else
            System.out.println("outside");
    }
}



3.I - 기하: 직선과 정점

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

정점 p0(x0, y0)에서 정점 p1(x1, y1)로의 직선이 있을 때, 정점 p2(x2, y2)가 직선의 왼쪽 또는 오른쪽 또는 직선의 연장선(양방향) 위에 있는지 판단하는 프로그램을 작성하세요.

Given a directed line from point p0(x0, y0) to p1(x1, y1), you can use the following condition to decide whether a point p2(x2, y2) is on the left of the line, on the right, or on the same line (see Figure 3.11):

Write a program that prompts the user to enter the three points for p0, p1, and p2 and displays whether p2 is on the left of the line from p0 to p1, on the right, or on the same line.

 

INPUT

* Line 1 : p0의 좌표 x1 y1

* Line 2 : p1의 좌표 x2 y2 (p0를 제외한 좌표)

* Line 3 : p2의 좌표 x3 y3

(x1,y1,x2,y2,x3,y3는 절대값이 100보다 작은 실수)

 

OUTPUT

* Line 1 : 만약 p2가 직선의 왼쪽에 있다면 left, 오른쪽에 있다면 right, 직선의 연장선(양방향) 위에 있다면 on the line을 출력

 

SAMPLE INPUT

1 1

5 5

2 2

 

SAMPLE OUTPUT

on the line

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Double x1 = input.nextDouble(), y1 = input.nextDouble(), x2 = input.nextDouble(), y2 = input.nextDouble(), x3 = input.nextDouble(), y3 = input.nextDouble();
        Double check = (y1 - y2) * x3 - (x1 - x2) * y3 - ((y1 - y2) * x1 - (x1 - x2) * y1);
        if (check == 0)
            System.out.println("on the line");
        else if (check < 0)
            System.out.println("right");
        else
            System.out.println("left");
    }
}

 

 

반응형

댓글