[명품 Java] 2장 실습문제 (자바 기본 프로그래밍)
2021. 11. 13. 16:17ㆍSolution`/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;
}
}
}