명품 JAVA Programming 제2강 자바 기본 프로그래밍 실습문제
Programming Language/Java

명품 JAVA Programming 제2강 자바 기본 프로그래밍 실습문제

728x90

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

원화를 입력하세요(단위 원)>>3300

 3300원은 $3.0입니다.

import java.util.Scanner;

public class Chap02_01 {
	public static void main(String args[]) {
		Scanner scan=new Scanner(System.in);
		
		System.out.print("원화를 입력하세요(단위 원)>>");
		int won=scan.nextInt();
		double dollar=won/1100;
		
		System.out.println(won+"원은 $"+dollar+"입니다.");
		scan.close();
	}
}

 

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

2자리수 정수 입력(10~99)>>77

Yse! 10의 자리와 1의 자리가 같습니다.

import java.util.Scanner;

public class Chap02_02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		
		System.out.print("2자리수 정수 입력(10~99)>>");
		int num=scan.nextInt();
		
		if ((num>=10)&&(num<=99)) {
			int ten=num/10;
			int one=num%10;
			if (ten==one)
				System.out.println("Yes! 10의 자리와 1의 자리가 같습니다.");
			else
				System.out.println("No! 10의 자리와 1의 자리가 같지 않습니다.");
		}
		else
			System.out.println("정수 범위 초과");
		
		scan.close();
	}

}

 

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

금액을 입력하시오>>65376

오만원권 1매

만원권 1매

천원권 5매

백원 3개

오십원 1개

십원 2개

일원 6개

import java.util.Scanner;

public class Chap02_03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner scan=new Scanner(System.in);
		int num=0; //지폐, 동전의 개수
		
		System.out.print("금액을 입력하시오>>");
		int money=scan.nextInt();
		
		num=money/50000;
		money%=50000;
		if (num!=0)
			System.out.println("오만원권 "+num+"매");
		
		num=money/10000;
		money%=10000;
		if (num!=0)
			System.out.println("만원권 "+num+"매");
		
		num=money/1000;
		money%=1000;
		if (num!=0)
			System.out.println("천원권 "+num+"매");
		
		num=money/500;
		money%=500;
		if (num!=0)
			System.out.println("오백원권 "+num+"매");
		
		num=money/100;
		money%=100;
		if (num!=0)
			System.out.println("백원권 "+num+"개");
		
		num=money/50;
		money%=50;
		if (num!=0)
			System.out.println("오십원 "+num+"개");
		
		num=money/10;
		money%=10;
		if (num!=0)
			System.out.println("십원 "+num+"개");
		
		num=money/1;
		money%=1;
		if (num!=0)
			System.out.println("일원 "+num+"개");
	}

}

 

출력 예에서 보면 개수가 0개인 지폐나 동전은 출력하지 않는다.

그래서 if (num!=0)을 추가해서 개수가 0이면 출력하지 않게 했다.

 

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

정수 3개 입력>>20 100 33

중간 값은 33

import java.util.Scanner;

public class Chap02_04 {
	public static void main(String args[]) {

		Scanner scan=new Scanner(System.in);
		int medium=0;
		
		System.out.print("정수 3개 입력>>");
		int num1=scan.nextInt();
		int num2=scan.nextInt();
		int num3=scan.nextInt();
		
		if (num1<=num2) { //먼저 num1과 num2 비교
			if(num1>num3) //num3<num1<=num2
				medium=num1;
			else {
				if(num2<=num3) //num1<=num2<=num3
					medium=num2;
				else //num1<=num3<num2
					medium=num3;
			}	
		}
		else {
			if(num1<=num3) //num2<num1<=num3
				medium=num1;
			else {
				if(num2<=num3) //num2<=num3<num1
					medium=num3;
				else //num3<num2<num1
					medium=num2;
			}
		}
		
		System.out.println("중간 값은 "+medium);
		scan.close();
	}
}

 

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

정수 3개를 입력하시오>>4 3 5

삼각형이 됩니다

import java.util.Scanner;

public class Chap02_05 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner scan=new Scanner(System.in);
		
		System.out.print("정수 3개를 입력하시오>>");
		int num1=scan.nextInt();
		int num2=scan.nextInt();
		int num3=scan.nextInt();
		
		if ((num1<num2+num3)&&(num2<num1+num3)&&(num3<num1+num2))
			System.out.println("삼각형이 됩니다");
		else
			System.out.println("삼각형이 안됩니다");
		
		scan.close();
	}

}

원래 삼각형은 가장 긴 변만 다른 두 변의 합보다 작은 것을 확인하면 삼각형이 된다.

하지만 가장 긴 변을 구하는 것은 또 별도의 시간이 걸릴 것이고 문제에서도 가장 긴 변만 확인하라는 말이 없어서 모든 변이 성립하는지 확인해줬다.

 

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

1~99 사이의 정수를 입력하시오>>36

박수짝짝

import java.util.Scanner;

public class Chap02_06 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner scan=new Scanner(System.in);
		int sum=0;
		
		System.out.print("1~99 사이의 정수를 입력하시오>>");
		int num=scan.nextInt();
		
		if((num>=1)&&(num<=99)) { //범위 확인
			int ten=num/10;
			int one=num%10;
			if((ten==3)||(ten==6)||(ten==9)) //십의 자리수 확인
				sum++;
			if((one==3)||(one==6)||(one==9)) //일의 자리수 확인
				sum++;
			
			if(sum==1)
				System.out.println("박수짝"); //하나만 있는 경우
			else if(sum==2)
				System.out.println("박수짝짝"); //둘 다 있는 경우
			else
				System.out.println(num); //없는 경우
		}
		else
			System.out.println("정수 범위 초과");
	}

}

 

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

점 (x, y)의 좌표를 입력하시오>>150 150

(150,150)는 사각형 안에 있습니다.

import java.util.Scanner;

public class Chap02_07 {
	public static void main(String args[]) {
		
		Scanner scan=new Scanner(System.in);
		
		System.out.print("점 (x,y)의 좌표를 입력하시오>>");
		int x=scan.nextInt();
		int y=scan.nextInt();
		
		if ((x>100)&&(x<200)&&(y>100)&&(y<200)) //직사각형의 테두리에 걸치는 것 포함x
			System.out.println("("+x+","+y+") 는 사각형 안에 있습니다.");
		else
			System.out.println("("+x+","+y+") 는 사각형 안에 있지 않습니다.");
		
		scan.close();
	}
}

나는 이 문제에서 점이 직사각형의 테두리에 걸치는 것은 안에 있지 않는다고 생각하고 풀었다.

테두리에 걸쳐도 포함한다고 생각하고 푼다면

if문을 if ((x>=100)&&(x<=200)&&(y>=100)&&(y<=200))로 바꿔주면 된다.

728x90

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

힌트: 다음은 점 (x,y)가 (rectx1, recty1), (rectx2, recty2)의 사각형 안에 있으면 true를 리턴하는 메소드이다. 이 메소드를 활용하라.

public static boolean inRect(int x, int y, int rectx1, int recty1, int rectx2, int recty2) {
	if ((x >= rectx1 && x <= rectx2) && (y >= recty1 && y <= recty2))
    	return true;
    else return false;
}

이 힌트를 보면 사각형의 테두리에 점이 걸친 것도 사각형에 포함한다고 생각하고 문제를 풀라는 거 같다.

또한 문제만 보았을 때는 두 사각형이 충돌한다는 기준이 너무 애매하다고 생각했다.

두 사각형의 변들이 서로 겹쳤을 때만 충돌이라고 하는 건지, 한 사각형이 다른 사각형 안에 포함되었을 때도 충돌한다고 하는 건지...

근데 힌트를 보면 한 점이 다른 두 점이 이루는 사각형 안에 존재하는지 알 수 있는 메소드를 주었다.

이 힌트를 보고 다음의 경우에만 사각형이 충돌한다고 생각하고 풀었다.

 

 

(100,100)과 (200,200)이 이루는 사각형 안에 (x1,y1)이나 (x2,y2) 한 점만 들어가 있고 다른 점이 이 사각형 밖에 있을 때 두 사각형은 무조건 충돌하게 되어있다.

 

 

 

 

 

나는 위와 같이 전재를 하고 문제를 풀었지만, 문제가 정확하게 명시를 안해줬기 때문에 한 사각형이 다른 사각형 안에 포함되었을 때도 충돌한다고 전재하고 풀어도  될 거 같다. 

import java.util.Scanner;

public class Chap02_08 {
	
	public static boolean inRect(int x, int y, int rectx1, int recty1, int rectx2, int recty2) {
		if ((x>=rectx1&&x<=rectx2)&&(y>=recty1&&y<=recty2))
			return true;
		else return false;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner scan=new Scanner(System.in);

		System.out.print("점 (x1,y1)의 좌표를 입력하시오>>");
		int x1=scan.nextInt();
		int y1=scan.nextInt();
		
		System.out.print("점 (x2,y2)의 좌표를 입력하시오>>");
		int x2=scan.nextInt();
		int y2=scan.nextInt();
		
		if(inRect(x1,y1,100,100,200,300)^inRect(x2,y2,100,100,200,200)) //제시한 점 1, 2 중 하나라도 주어진 사각형 안에 있다면 true
			System.out.println("두 사각형은 충돌합니다.");
		else
			System.out.println("두 사각형은 충돌하지 않습니다.");
		
		scan.close();
	}

}

이 코드는 포함되었을 때는 충돌이 아니라고 전재하고 푼 문제.

포함되었을 때도 충돌이라고 전재한다면

if문의 if(inRect(x1,y1,100,100,200,300)^inRect(x2,y2,100,100,200,200))을

if(inRect(x1,y1,100,100,200,300)||inRect(x2,y2,100,100,200,200)||inRect(100,100,x1,y1,x2,y2)||inRect(200,200,x1,y1x2,y2))로 바꿔주면 된다.

이는 (100,100), (200,200) 사각형이 (x1,y1),(x2,y2) 사각형 안에 포함될 경우도 추가해준 것이다. 

 

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

원의 중심과 반지름 입력>>10 10 6.5

점 입력>>13 13

점 (13.0, 13.0)는 원 안에 있다.

힌트: 중심에서 점 (x, y) 사이의 거리가 반지름보다 작거나 같으면 원의 내부에 있다. 변수 x에 대한 제곱근의 값은 Math.sqrt(x)를 이용하면 된다. Math는 6장에서 설명한다.

import java.util.Scanner;

public class Chap02_09 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner scan=new Scanner(System.in);
		
		System.out.print("원의 중심과 반지름 입력>>");
		int circlex=scan.nextInt();
		int circley=scan.nextInt();
		double radius=scan.nextDouble();
		
		System.out.print("점 입력>>");
		int x=scan.nextInt();
		int y=scan.nextInt();
		
		double distance=(((circlex-x)*(circlex-x))+((circley-y)*(circley-y)));
		distance=Math.sqrt(distance);
		
		if(distance<=radius)
			System.out.println("점 ("+x+", "+y+")는 원 안에 있다.");
		else
			System.out.println("점 ("+x+", "+y+")는 원 안에 있지 않다.");
		
		scan.close();
	}

}

 

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

첫번째 원의 중심과 반지름 입력>>10 10 3

두번째 원의 중심과 반지름 입력>>12 12 2

두 원은 서로 겹친다.

import java.util.Scanner;

public class Chap02_10 {

	public static void main(String args[]) {
		
		Scanner scan=new Scanner(System.in);
		
		System.out.print("첫번째 원의 중심과 반지름 입력>>");
		int x1=scan.nextInt();
		int y1=scan.nextInt();
		double radius1=scan.nextDouble();
		
		System.out.print("두번째 원의 중심과 반지름 입력>>");
		int x2=scan.nextInt();
		int y2=scan.nextInt();
		double radius2=scan.nextDouble();
		
		double distance=(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));
		distance=Math.sqrt(distance);
		
		if (distance<=(radius1+radius2))
			System.out.println("두 원은 서로 겹친다.");
		else
			System.out.println("두 원은 서로 겹치지 않는다.");
		
		scan.close();
	}
}

 

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

달을 입력하세요(1~12)>>9

가을

(1)if-else 문을 이용하여 프로그램을 작성하라.

import java.util.Scanner;

public class Chap02_11 {

		public static void main(String args[]) {
			
			Scanner scan=new Scanner(System.in);
			
			System.out.print("달을 입력하세요(1~12)>>");
			int month=scan.nextInt();
			
			if ((month>=1)&&(month<=12)) {
				if((month==3)||(month==4)||(month==5))
					System.out.println("봄");
				else if((month==6)||(month==7)||(month==8))
					System.out.println("여름");
				else if((month==9)||(month==10)||(month==11))
					System.out.println("가을");
				else
					System.out.println("겨울");
				}
			else
				System.out.println("잘못입력");
		}
				
}

(2)switch 문을 이용하여 프로그램을 작성하라.

import java.util.Scanner;

public class Chap02_11 {

		public static void main(String args[]) {
			
			Scanner scan=new Scanner(System.in);
			
			System.out.print("달을 입력하세요(1~12)>>");
			int month=scan.nextInt();
			
			if ((month>=1)&&(month<=12)) {
				switch (month) {
				case 3: case 4: case 5:
					System.out.println("봄");
					break;
				case 6: case 7: case 8:
					System.out.println("여름");
					break;
				case 9: case 10: case 11:
					System.out.println("가을");
					break;
				case 12: case 1: case 2:
					System.out.println("겨울");
					break;
				}
			}
			else
				System.out.println("잘못입력");
		}
				
}

 

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

연산>>2 + 4

2+4의 계산 결과는 6

힌트: 연산자는 scanner.next()를 이용하여 문자열로 입력받으면 된다. 문자열 s가 "+"와 같은지 검사하려면 if(s.equals("+"))를 이용하며, true이면 s와 "+"가 같다.

(문제의 '='는 '-' 오타난걸로 생각하고 '-'로 품.)

(1) 연산 식을 구분할 때 if-else 문을 이용하여 프로그램을 작성하라.

import java.util.Scanner;

public class Chap02_12 {

	public static void main(String args[]) {
		
		Scanner scan=new Scanner(System.in);
		double answer=0;
		
		System.out.print("연산>>");
		double num1=scan.nextDouble();
		String oper=scan.next();
		double num2=scan.nextDouble();
		
		if (num2!=0) {
			 if (oper.equals("+"))
				 answer=num1+num2;
			 else if (oper.equals("-"))
				answer=num1-num2;
			 else if (oper.equals("*"))
				answer=num1*num2;
			 else
				answer=num1/num2;
			System.out.println((int)(num1)+oper+(int)(num2)+"의 계산 결과는 "+(int)(answer));
		}
		else
			System.out.println("0으로 나눌 수 없습니다.");
	}
}

(2) 연산 식을 구분할 때 switch 문을 이용하여 프로그램을 작성하라.

import java.util.Scanner;

public class Chap02_12 {

	public static void main(String args[]) {
		
		Scanner scan=new Scanner(System.in);
		double answer=0;
		
		System.out.print("연산>>");
		double num1=scan.nextDouble();
		String oper=scan.next();
		double num2=scan.nextDouble();
		
		if (num2!=0) {
			switch (oper) {
			case "+":
				answer=num1+num2;
				break;
			case "-":
				answer=num1-num2;
				break;
			case "*":
				answer=num1*num2;
				break;
			case "/":
				answer=num1/num2;
				break;
			}
			System.out.println(num1+oper+num2+"의 계산 결과는 "+answer);
		}
		else
			System.out.println("0으로 나눌 수 없습니다.");
	}
}

 

Open Challenge 가위바위보 게임: 두 사람이 하는 가위바위보 게임을 만들어보자. 두 사람의 이름은 '철수와 '영희'이다. 먼저 "철수 >>" 출력하고 "가위", "바위", "보" 중 하나를 문자열로 입력받는다. 그리고 "영희 >>"를 출력하고 마찬가지로 입력받는다. 입력받은 문자열을 비교하여 누가 이겼는지 판별하여 승자를 출력한다.

가위바위보 게임입니다. 가위, 바위, 보 중에서 입력하세요.

철수 >> 가위

영희 >>

철수가 이겼습니다.

힌트:

  • System.out.print("철수 >>")는 화면 출력 이후 커서를 다음 줄로 옮기지 않는다.
  • 문자열을 읽기 위해서는 Scanner 클래스의 next() 메소드를 이용하면 된다.
  • 자바에서 문자열 비교는 주의를 기울여야 한다. String var;로 선언한 var와 "가위"를 비교하기 위해서는 if(var=="가위")로 하면 안 된다. if(var.equals("가위"))로 비교하여야 한다(6장의 String 절에서 자세히 설명).
import java.util.Scanner;

public class Chap2_OpenChallenge {

	public static void main(String[] args) {
		System.out.println("가위바위보 게임입니다. 가위, 바위, 보 중에서 입력하세요");
		Scanner scan=new Scanner(System.in);
		int winner=0;
		
		System.out.print("철수>>>");
		String cs=scan.next();
		
		System.out.print("영희>>>");
		String yh=scan.next();
		
		switch(cs) {
		case "가위":
			if(yh.equals("가위"))
				winner=1;
			else if (yh.equals("바위"))
				winner=2;
			else
				winner=3;
			break;
		case "바위":
			if(yh.equals("가위"))
				winner=3;
			else if (yh.equals("바위"))
				winner=1;
			else
				winner=2;
			break;
		case "보":
			if(yh.equals("가위"))
				winner=2;
			else if (yh.equals("바위"))
				winner=3;
			else
				winner=1;
			break;
		}
		
		switch (winner) {
		case 1:
			System.out.println("비겼습니다.");
			break;
		case 2:
			System.out.println("영희가 이겼습니다.");
			break;
		case 3:
			System.out.println("철수가 이겼습니다.");
			break;
			}
	}
}
728x90