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

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

728x90

1. 다음 main( )이 실행되면 아래 예시와 같이 출력되도록 MyPoint 클래스를 작성하라.

public static void main(String[] args) {
	MyPoint p = new MyPoint(3, 50);
	MyPoint q = new MyPoint(4, 50);
	System.out.println(p);
	if (p.equals(q))
		System.out.println("같은 점");
	else
		System.out.println("다른 점");
}
--출력--
Point(3,50)
다른 점

public class MyPoint {
	int x; int y;
	
	MyPoint (int x, int y) {
		this.x=x;
		this.y=y;
	}
	
	public String toString() {
		return "Point("+x+","+y+")";
	}
	
	public boolean equals(Object obj) {
		MyPoint mp=(MyPoint)obj;
		if ((x==mp.x)&&(y==mp.y))
			return true;
		else
			return false;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyPoint p = new MyPoint(3, 50);
		MyPoint q = new MyPoint(4, 50);
		System.out.println(p);
		if (p.equals(q))
			System.out.println("같은 점");
		else
			System.out.println("다른 점");
	}

}

 

2. 중심을 나타내는 정수 x, y와 반지름 radius 필드를 가지는 Circle 클래스를 작성하고자 한다. 생성자는 3개의 인자(x, y, radius)를 받아 해당 필드를 초기화하고, equals( ) 메소드는 두 개의 Circle 객체의 중심이 같으면 같은 것으로 판별하도록 한다.

public static void main(String[] args) {
	Circle a = new Circle(2,3,5); //중심 (2,3)에 반지름 5인 원
	Circle b = new Circle(2,3,30); //중심 (2,3)에 반지름 30인 원
	System.out.println("원 a : " + a);
	System.out.println("원 b : " + b);
	if(a.equals(b))
		System.out.println("같은 원");
	else
		System.out.println("서로 다른 원");
}
--출력--
원 a : Circle(2,3)반지름5
원 b : Circle(2,3)반지름30
같은 원

public class Circle {
	int x; int y; int radius;
	
	Circle (int x, int y, int radius) {
		this.x=x;
		this.y=y;
		this.radius=radius;
	}
	
	public String toString() {
		return "Circle("+x+","+y+")반지름"+radius;
	}
	
	public boolean equals(Circle c) {
		if ((x==c.x)&&(y==c.y))
			return true;
		else
			return false;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Circle a = new Circle(2,3,5); //중심 (2,3)에 반지름 5인 원
		Circle b = new Circle(2,3,30); //중심 (2,3)에 반지름 30인 원
		System.out.println("원 a : " + a);
		System.out.println("원 b : " + b);
		if(a.equals(b))
			System.out.println("같은 원");
		else
			System.out.println("서로 다른 원");
	}

}

 

3. 다음 코드를 수정하여, Calc 클래스는 etc 패기지에, MainApp 클래스는 main 패키지로 분리 작성하라.

class Calc {
	private int x, y;
	public Calc(int x, int y) {this.x = x; this.y = y; }
	public int sum() { return x+y; }
}

public class MainApp {
	public static void main(String[] args) {
		Calc c = new Calc(10, 20);
		System.out.println(c.sum());
	}
}

package etc;

public class Calc {
	private int x, y;
	public Calc(int x, int y) {this.x = x; this.y = y; }
	public int sum() { return x+y; }
}
package main;
import etc.Calc;

public class MainApp {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Calc c = new Calc(10, 20);
		System.out.println(c.sum());
	}

}

 

4. 다음 코드를 수정하여 Shape 클래스는 base 패키지에, Circle 클래스는 derived 패키지에, GraphicEditor 클래스는 app 패키지에 분리 작성하라.

class Shape {
	public void draw() { System.out.println("Shape"); }
}
class Circle extends Shape {
	public void draw() { System.out.println("Circle"); }
}
public class GraphicEditor {
	public static void main(String[] args) {
		Shape shape = new Circle();
		shape.draw();
	}
}

package base;

public class Shape {
	public void draw() { System.out.println("Shape"); }
}
package derived;
import base.Shape;

public class Circle extends Shape {
	public void draw() { System.out.println("Circle"); }
}
package app;
import base.Shape;
import derived.Circle;

public class GraphicEditor {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Shape shape = new Circle();
		shape.draw();
	}

}

 

5. Calendar 객체를 생성하면 현재 시간을 알 수 있다. 프로그램을 실행한 현재 시간이 새벽 4시에서 낮 12시 이전이면 "Good Morning"을, 오후 6시 이전이면 "Good Afternoon"을, 밤 10시 이전이면 "Good Evening"을, 그 이후는 "Good Night"을 출력하는 프로그램을 작성하라.

--출력--
현재 시간은 10시 22분입니다.
Good Morning

import java.util.*;

public class Chap06_05 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Calendar now=Calendar.getInstance();
		int hourOfDay=now.get(Calendar.HOUR_OF_DAY);
		int minute=now.get(Calendar.MINUTE);
		System.out.println("현재 시간은 "+hourOfDay+"시 "+minute+"분입니다.");
		
		if ((hourOfDay>=4)&&(hourOfDay<12))
			System.out.println("Good Morning");
		else if ((hourOfDay>=12)&&(hourOfDay<18))
			System.out.println("Good Afternoon");
		else if ((hourOfDay>=18)&&(hourOfDay<22))
			System.out.println("Good Evening");
		else
			System.out.println("Good Night");
	}

}

 

6. 경과시간을 맞추는 게임을 작성하라. 다음 예시를 참고하면, <Enter> 키를 입력하면 현재 초 시간을 보여주고 여기서 10초에 더 근접하도록 다음 <Enter> 키를 입력한 사람이 이기는 게임이다. 

--출력--
10초에 가까운 사람이 이기는 게임입니다.
황기태 시작 <Enter>키>>
	현재 초 시간 = 42
10초 예상 후 <Enter>키>>
	현재 초 시간 = 50
이재문 시작 <Enter>키>>
	현재 초 시간 = 51
10초 예상 후 <Enter>키>>
	현재 초 시간 = 4
황기태의 결과 8, 이재문의 결과 13, 승자는 황기태

힌트 :

<Enter> 키를 입력받기 위해서는 Scanner.nextLine( )을 호출하면 된다.


내 생각 :

시간은 Calendar 객체를 생성할 때의 시간으로 저장된다.
따라서 ssecond를 전달 받을 때의 Calendar 객체와 esecond를 전달받을 때의 Calendar 객체를 따로 생성해주어야 하며, 전달받고 싶은 시간에 객체를 생성해 주어야 한다.(미리 생성하면 안된다.)

import java.util.*;

public class Chap06_06 {
	Scanner scan=new Scanner(System.in);
	private String name;
	private int time;
	
	Chap06_06 (String name) {
		this.name=name;
		
		System.out.print(name+" 시작 <Enter>키>>");
		scan.nextLine();
		Calendar start=Calendar.getInstance();
		int ssecond=start.get(Calendar.SECOND);
		System.out.println("	현재 초 시간 = "+ssecond);
		System.out.print("10초 예상 후 <Enter>키>>");
		scan.nextLine();
		Calendar end=Calendar.getInstance();
		int esecond=end.get(Calendar.SECOND);
		System.out.println("	현재 초 시간 = "+esecond);
		if (esecond>ssecond)
			time=esecond-ssecond;
		else
			time=60+esecond-ssecond;
	}
	
	String getName() { return name; }
	
	int getTime() { return time; }
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println("10초에 가까운 사람이 이기는 게임입니다.");
		Chap06_06 player1=new Chap06_06("황기태");
		Chap06_06 player2=new Chap06_06("이재문");
		
		
		System.out.print(player1.getName()+"의 결과 "+player1.getTime()+", "+player2.getName()+"의 결과 "+player2.getTime());
		if (Math.abs(player1.getTime()-10)<Math.abs(player2.getTime()-10))
			System.out.println(", 승자는 황기태");
		else if (Math.abs(player1.getTime()-10)>Math.abs(player2.getTime()-10))
			System.out.println(", 승자는 이재문");
		else
			System.out.println(", 비겼습니다.");
	}

}

 

7. Scanner를 이용하여 한 라인을 읽고, 공백으로 분리된 어절이 몇 개 들어 있는지 "그만"을 입력할 때까지 반복하는 프로그램을 작성하라.

--출력--
>>I love Java.
어절 개수는 3
>>자바는 객체 지향 언어로서 매우 좋은 언어이다.
어절 개수는 7
>>그만
종료합니다...

힌트 :

Scanner.nextLine( )을 이용하면 빈칸을 포함하여 한 번에 한 줄을 읽을 수 있다.


(1) StringTokenizer 클래스를 이용하여 작성하라.

import java.util.*;

public class Chap06_07_StringTokenizer {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		
		while(true) {
			System.out.print(">>");
			String s=scan.nextLine();
			if (s.equals("그만"))
				break;
			StringTokenizer st=new StringTokenizer(s, " ");
			System.out.println("어절 개수는 "+st.countTokens());
		}
		System.out.println("종료합니다...");
	}

}

(2) String 클래스의 split( ) 메소드를 이용하여 작성하라.

import java.util.*;

public class Chap06_07_split {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		
		while(true) {
			System.out.print(">>");
			String s=scan.nextLine();
			if (s.equals("그만"))
				break;
			String arr[]=s.split(" ");
			System.out.println("어절 개수는 "+arr.length);
		}
		System.out.println("종료합니다...");
	}

}
728x90

8. 문자열을 입력받아한 글자씩 회전시켜 모두 출력하는 프로그램을 작성하라.

--출력--
문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다.
I Love you
 Love youI
Love youI 
ove youI L
ve youI Lo
e youI Lov
 youI Love
youI Love 
ouI Love y
uI Love yo
I Love you

힌트 :

Scanner.nextLine( )을 이용하면 빈칸을 포함하여 한 번에 한 줄을 읽을 수 있다.


import java.util.*;

public class Chap06_08 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		System.out.println("문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다.");
		String s=scan.nextLine();
		
		for (int i=1;i<s.length();i++)
			System.out.println(s.substring(i)+s.substring(0,i));
		System.out.println(s);
	}

}

 

9. 철수와 컴퓨터의 가위바위보 게임을 만들어보자. 가위, 바위, 보는 각각 1, 2, 3 키이다. 철수가 키를 입력하면, 동시에 프로그램도 Math.Random( )을 이용하여 1, 2, 3 중에 한 수를 발생시키고 이것을 컴퓨터가 낸 것으로 한다. 그런 다음 철수와 컴퓨터 중 누가 이겼는지 판별하여 승자를 출력하라.

--출력--
철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>1
철수(가위) : 컴퓨터(바위)
컴퓨터가 이겼습니다.
철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>3
철수(보) : 컴퓨터(바위)
철수가 이겼습니다.
철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>4

import java.util.*;

public class Chap06_09 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		String arr[]= {"가위", "바위", "보"};
		
		while(true) {
			System.out.print("철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>");
			int player=scan.nextInt();
			if (player==4)
				break;
			int cpt=(int)(Math.random()*3+1);
			System.out.println("철수("+arr[player-1]+") : 컴퓨터("+arr[cpt-1]+")");
			if (((player==1)&&(cpt==1))||((player==2)&&(cpt==2))||((player==3)&&(cpt==3)))
				System.out.println("비겼습니다.");
			else if (((player==1)&&(cpt==3))||((player==2)&&(cpt==1))||((player==3)&&(cpt==2)))
				System.out.println("철수가 이겼습니다.");
			else
				System.out.println("컴퓨터가 이겼습니다.");
		}
	}

}

 

10. 갬블링 게임을 만들어보자. 두 사람이 게임을 진행한다. 이들의 이름을 키보드로 입력받으며 각 사람은 Person 클래스로 작성하라. 그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다. 두 사람은 번갈아 가면서 게임을 진행하는데 각 사람이 자기 차례에서 <Enter> 키를 입력하면, 3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다. 난수의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.

--출력--
1번째 선수 이름>>수희
2번째 선수 이름>>연수
[수희]:<Enter>
	3	1	1	아쉽군요!
[연수]:<Enter>
	3	1	3	아쉽군요!
[수희]:<Enter>
	2	2	1	아쉽군요!
[연수]:<Enter>
	1	1	2	아쉽군요!
[수희]:<Enter>
	3	3	3	수희님이 이겼습니다!

import java.util.*;

public class Person {
	Scanner scan=new Scanner(System.in);
	private String name;
	
	Person (String name) { this.name=name; }
	
	boolean play() {
		System.out.print("["+name+"]:<Enter>");
		scan.nextLine();
		System.out.print("\t");
		int arr[]=new int[3];
		for (int i=0;i<3;i++) {
			arr[i]=(int)(Math.random()*3+1);
			System.out.print(arr[i]+"\t");
		}
		if ((arr[0]==arr[1])&&(arr[0]==arr[2]))
			return true;
		else
			return false;
	}
	
	String getName() { return name; }
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		System.out.print("1번째 선수 이름>>");
		Person p1=new Person(scan.next());
		System.out.print("2번째 선수 이름>>");
		Person p2=new Person(scan.next());
		
		while(true) {
			if (p1.play()) {
				System.out.println(p1.getName()+"님이 이겼습니다!");
				break;
			}
			else
				System.out.println("아쉽군요!");
			if (p2.play()) {
				System.out.println(p2.getName()+"님이 이겼습니다!");
				break;
			}
			else
				System.out.println("아쉽군요!");
		}
		
	}

}

11. StringBuffer 클래스를 활용하여 명령처럼 문자열을 수정하라. 아래 실행 예시에서 love!LOVE는 love를 찾아 LOVE로 수정하라는 명령이다. 첫 번째 만난 문자열만 수정한다.

--출력--
>>우리는 love Java Programming.
명령: 우리는!We
We love Java Programming.
명령: LOV!사랑
찾을 수 없습니다!
명령: !Java
잘못된 명령입니다!
명령: love!LOVE
We LOVE Java Programming.
명령: 그만
종료합니다

import java.util.*;

public class Chap06_11 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		System.out.print(">>");
		String s=scan.nextLine();
		
		while(true) {
			System.out.print("명령: ");
			String order=scan.nextLine();
			if (order.equals("그만"))
				break;
			String orders[]=order.split("!");
			if (orders[0].equals(""))
				System.out.println("잘못된 명령입니다!");
			else if (!s.contains(orders[0]))
				System.out.println("찾을 수 없습니다!");
			else {
				StringBuffer sb=new StringBuffer(s);
				int start=sb.indexOf(orders[0]);
				sb=sb.replace(start, start+orders[0].length(), orders[1]);
				s=sb.toString();
				System.out.println(s);
			}
		}
		System.out.println("종료합니다");
	}

}

 

12. 문제 10의 갬블링 게임을 n명이 하도록 수정하라. 실행 예시와 같이 게임에 참여하는 선수의 수를 입력받고 각 선수의 이름을 입력받도록 수정하라.

--출력--
갬블링 게임에 참여할 선수 숫자>>3
1번째 선수 이름>>황
2번째 선수 이름>>이
3번째 선수 이름>>김
[황]:<Enter>
	2	3	3	아쉽군요!
[이]:<Enter>
	1	2	2	아쉽군요!
[김]:<Enter>
	2	2	3	아쉽군요!
[황]:<Enter>
	3	2	2	아쉽군요!
[이]:<Enter>
	1	1	3	아쉽군요!
[김]:<Enter>
	2	2	1	아쉽군요!
[황]:<Enter>
	2	2	2	황님이 이겼습니다!

public class Person {
	Scanner scan=new Scanner(System.in);
	private String name;
	
	Person (String name) { this.name=name; }
	
	boolean play() {
		System.out.print("["+name+"]:<Enter>");
		scan.nextLine();
		System.out.print("\t");
		int arr[]=new int[3];
		for (int i=0;i<3;i++) {
			arr[i]=(int)(Math.random()*3+1);
			System.out.print(arr[i]+"\t");
		}
		if ((arr[0]==arr[1])&&(arr[0]==arr[2]))
			return true;
		else
			return false;
	}
	
	String getName() { return name; }
}
import java.util.*;

public class Chap06_12 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		System.out.print("갬블링 게임에 참여할 선수 숫자>>");
		int n=scan.nextInt();
		Person person[]=new Person[n];
		for (int i=0;i<n;i++) {
			System.out.print((i+1)+"번째 선수 이름>>");
			person[i]=new Person(scan.next());
		}
		
		int key=1;
		while(key==1) {
			for (int i=0;i<n;i++) {
				if (person[i].play()) {
					System.out.println(person[i].getName()+"님이 이겼습니다!");
					key=0;
					break;
				}
				else
					System.out.println("아쉽군요!");
			}
			
		}
	}

}

 

Open Challenge 영문자 히스토그램 만들기

텍스트를 키보드로 입력받아 알파벳이 아닌 문자는 제외하고 영문자 히스토그램을 만들어보자. 대문자와 소문자는 모두 같은 것으로 간주하고, 세미콜론(;)만 있는 라인을 만나면 입력의 끝으로 해석한다.

--출력--
영문 텍스트를 입력하고 세미콜론을 입력하세요.
It's now or never, come hold me tight
Kiss me my darling, be mine tonight
Tomorrow will be too late
It's now or never, my love won't wait
When I first saw you, with your smile so tender
My heart was captured, my soul surrendered
I spent a lifetime, waiting for the right time
Now that your near, the time is here, at last
It's now or never, come hold me tight
Kiss me my darling, be mine tonight
Tomorrow will be too late
It's now or never, my love won't wait
;
히스토그램을 그립니다.
A----------------
B----
C---
D--------
E-------------------------------------------
F---
G--------
H--------------
I-------------------------------
J
K--
L----------------
M--------------------
N-----------------------
O-----------------------------------
P--
Q
R---------------------------
S------------------
T---------------------------------------
U------
V------
W------------------
X
Y---------
Z

힌트 :

키보드로부터 텍스트를 입력받아 하나의 문자열로 리턴하는 코드는 다음을 이용하라. 이 코드는 한 라인이 세미콜론(;)과 <Enter> 키로 입력되면, 입력이 끝난 것으로 판단한다.

 

String readString() {
	StringBuffer sb = new StringBuffer(); // 키 입력을 받을 스트링버퍼 생성
	Scanner scanner = new Scanner(System.in);
	while (true) {
		String line = scanner.nextLine(); // 텍스트 한 라인을 읽는다.
		if(line.equals(";")) // ';'만 있는 리인이면
			break; // 입력 끝
		sb.append(line); // 읽은 라인 문자열을 스트링버퍼에 추가한다.
	}
	return sb.toString(); // 스트링버퍼의 문자열을 스트링으로 리턴
}

import java.util.*;

public class Histogram {

	static String readString() {
		StringBuffer sb = new StringBuffer(); // 키 입력을 받을 스트링버퍼 생성
		Scanner scanner = new Scanner(System.in);
		while (true) {
			String line = scanner.nextLine(); // 텍스트 한 라인을 읽는다.
			if(line.equals(";")) // ';'만 있는 리인이면
				break; // 입력 끝
			sb.append(line); // 읽은 라인 문자열을 스트링버퍼에 추가한다.
		}
		return sb.toString(); // 스트링버퍼의 문자열을 스트링으로 리턴
	}
	
	static int[] countApb(String s) {
		int apb[]=new int[26];
		for (int i=0;i<s.length();i++) {
			char c=s.charAt(i);
			int ascii;
			if ((c>=65)&&(c<=90)) {//대문자
				ascii=c-65;
				apb[ascii]++;
			}
			else if ((c>=97)&&(c<=122)) {//소문자
				ascii=c-97;
				apb[ascii]++;
			}
		}
		return apb;
	}
	
	static void drawHisto(int apb[]) {
		System.out.println("히스토그램을 그립니다.");
		for (int i=0;i<26;i++) {
			char c=(char)(65+i);
			System.out.print(c);
			for (int j=0;j<apb[i];j++)
				System.out.print("-");
			System.out.println();
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("영문 텍스트를 입력하고 세미콜론을 입력하세요.");
		String s=readString();
		int apb[]=countApb(s);
		drawHisto(apb);
	}

}
728x90