[명품 Java] 7장 실습문제 (제네릭과 컬렉션)
2021. 12. 14. 21:24ㆍSolution`/Java
[7장 1번]
Scanner 클래스로 -1이 입력될 때까지 양의 정수를 입력받아 벡터에 저장하고 벡터를 검색하여 가장 큰 수를 출력하는 프로그램을 작성하라.
package Java7_1;
import java.util.*;
public class Java7_1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Vector<Integer> v = new Vector<Integer>();
System.out.print("정수(-1이 입력될 때까지)>> ");
while(true){
int num = sc.nextInt();
if(num == -1)
break;
v.add(num);
}
System.out.println("가장 큰 수는 " + Collections.max(v));
}
}
----------------------------
정수(-1이 입력될 때까지)>> 10 6 22 6 88 77 156 157 159 2586 -1
가장 큰 수는 2586
[7장 2번]
Scanner 클래스를 사용하여 6개 학점('A', 'B', 'C', 'D', 'F')을 문자로 입력받아 ArrayList에 저장하고, ArrayList를 검색하여 학점을 점수(A=4.0, B=3.0, C=2.0, D=1.0, F=0)로 변환하여 평균을 출력하는 프로그램을 작성하라.
package Java7_2;
import java.util.*;
public class Java7_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Character> al = new ArrayList<Character>();
double result = 0;
System.out.print("6개의 학점을 빈 칸으로 분리 입력(A/B/C/D/F)>> ");
for(int i=0; i<6; i++){
char ch = sc.next().charAt(0);
al.add(ch);
}
for(int i=0; i<al.size(); i++){
switch(al.get(i)){
case'A':
result+=4;
break;
case 'B':
result+=3;
break;
case 'C':
result+=2;
break;
case 'D':
result+=1;
break;
case 'F':
break;
}
}
System.out.println(result/al.size());
}
}
--------------------------------
6개의 학점을 빈 칸으로 분리 입력(A/B/C/D/F)>> A B C A B C
3.0
[7장 3번]
"그만"이 입력될 때까지 나라 이름과 인구를 입력받아 저장하고, 다시 나라 이름을 입력받아 인구를 출력하는 프로그램을 작성하라. 다음 해시맵을 이용하라.
package Java7_3;
import java.util.*;
public class Java7_3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, Integer> nations = new HashMap<String, Integer>();
System.out.println("나라 이름과 인구를 입력하세요.(예 : Korea 5000)");
while(true){
System.out.print("나라 이름, 인구 >> ");
String name = sc.next();
if(name.equals("그만"))
break;
int pop = sc.nextInt();
nations.put(name, pop);
}
while(true){
System.out.print("인구 검색 >> ");
String nation = sc.next();
if(nation.equals("그만"))
break;
Integer pop = nations.get(nation);
if(pop == null)
System.out.println(nation + "의 인구는 없습니다.");
else
System.out.println(nation + "의 인구는 " + pop);
}
}
}
---------------------------------
나라 이름과 인구를 입력하세요.(예 : Korea 5000)
나라 이름, 인구 >> Korea 5000
나라 이름, 인구 >> USA 1000000
나라 이름, 인구 >> Swiss 2000
나라 이름, 인구 >> France 3000
나라 이름, 인구 >> 그만
인구 검색 >> France
France의 인구는 3000
인구 검색 >> Swiss
Swiss의 인구는 2000
인구 검색 >> 스위스
스위스의 인구는 없습니다.
인구 검색 >> Korea
Korea의 인구는 5000
인구 검색 >> 그만
[7장 4번]
Vector 컬렉션을 이용하여 강수량의 평균을 유지 관리하는 프로그램을 작성하라. 강수량을 입력하면 벡터에 추가하고 현재 입력된 모든 강수량과 평균을 출력한다.
package Java7_4;
import java.util.*;
public class Java7_4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Vector<Integer> v = new Vector<Integer>();
while(true){
double result = 0;
System.out.print("강수량 입력 (0 입력시 종료) >> ");
int rain = sc.nextInt();
if(rain == 0)
break;
v.add(rain);
for(int i=0; i<v.size(); i++){
System.out.print(v.get(i) + " ");
}
for(int i=0; i<v.size(); i++){
result+=v.get(i);
}
System.out.println("\n현재 평균 " + (int)result/v.size());
}
}
}
--------------------------------
강수량 입력 (0 입력시 종료) >> 5
5
현재 평균 5
강수량 입력 (0 입력시 종료) >> 80
5 80
현재 평균 42
강수량 입력 (0 입력시 종료) >> 53
5 80 53
현재 평균 46
강수량 입력 (0 입력시 종료) >> 22
5 80 53 22
현재 평균 40
강수량 입력 (0 입력시 종료) >> 150
5 80 53 22 150
현재 평균 62
강수량 입력 (0 입력시 종료) >> 0
[7장 5번]
하나의 학생 정보를 나타내는 Student 클래스에는 이름, 학과, 학번, 학점 평균을 저장하는 필드가 있다.
(1) 학생마다 Student 객체를 생성하고 4명의 학생 정보를 ArrayList<Student> 컬렉션에 저장한 후에, ArrayList<Student>의 모든 학생(4명) 정보를 출력하고 학생 이름을 입력받아 해당 학생의 학점 평균을 출력하는 프로그램을 작성하라.
package Java7_5;
import java.util.*;
class Student{
private String name, major; // 이름, 학과
private int num; // 학번
private double gpa; // 학점 평균
Student(String name, String major, int num, double gpa){
this.name = name;
this.major = major;
this.num = num;
this.gpa = gpa;
}
String getName(){
return name;
}
String getMajor(){
return major;
}
int getNum(){
return num;
}
double getGpa(){
return gpa;
}
}
public class Java7_5_1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Student> al = new ArrayList<Student>();
Student[] student = new Student[4];
System.out.println("학생 이름, 학과, 학번, 학점평균을 입력하세요.");
for(int i=0; i<student.length; i++){
System.out.print(">> ");
String text = sc.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String name = st.nextToken().trim();
String major = st.nextToken().trim();
int num = Integer.parseInt(st.nextToken().trim());
double gpa = Double.parseDouble(st.nextToken().trim());
student[i] = new Student(name, major, num, gpa);
al.add(student[i]);
}
for(int i=0; i<al.size(); i++){
System.out.println("------------------------------");
Student s = al.get(i);
System.out.println("이름 : " + s.getName());
System.out.println("학과 : " + s.getMajor());
System.out.println("학번 : " + s.getNum());
System.out.println("학점평균 : " + s.getGpa());
}
System.out.println("------------------------------");
while(true){
System.out.print("학생 이름 >> ");
String name = sc.next();
if(name.equals("그만"))
break;
for(int i=0; i<al.size(); i++){
Student s = al.get(i);
if(s.getName().equals(name)) {
System.out.println(s.getName() + ", " + s.getMajor() + ", " +
s.getNum() + ", " + s.getGpa());
break;
}
}
}
sc.close();
}
}
-----------------------------------------
학생 이름, 학과, 학번, 학점평균을 입력하세요.
>> 이승우, 모바일, 1, 4.1
>> 백승호, 안드로이드, 2, 3.9
>> 손흥민, 웹공학, 3, 3.5
>> 차범근, 빅데이터, 4, 4.25
------------------------------
이름 : 이승우
학과 : 모바일
학번 : 1
학점평균 : 4.1
------------------------------
이름 : 백승호
학과 : 안드로이드
학번 : 2
학점평균 : 3.9
------------------------------
이름 : 손흥민
학과 : 웹공학
학번 : 3
학점평균 : 3.5
------------------------------
이름 : 차범근
학과 : 빅데이터
학번 : 4
학점평균 : 4.25
------------------------------
학생 이름 >> 이승우
이승우, 모바일, 1, 4.1
학생 이름 >> 백승호
백승호, 안드로이드, 2, 3.9
학생 이름 >> 손흥민
손흥민, 웹공학, 3, 3.5
학생 이름 >> 차범근
차범근, 빅데이터, 4, 4.25
학생 이름 >> 그만
(2) ArrayList<Student> 대신, HashMap<String, Studnet> 해시맵을 이용하여 다시 작성하라. 해시맵에서 키는 학생 이름으로 한다.
package Java7_5_2;
import java.util.*;
class Student{
private String name, major; // 이름, 학과
private int num; // 학번
private double gpa; // 학점 평균
Student(String name, String major, int num, double gpa){
this.name = name;
this.major = major;
this.num = num;
this.gpa = gpa;
}
String getName(){
return name;
}
String getMajor(){
return major;
}
int getNum(){
return num;
}
double getGpa(){
return gpa;
}
}
public class Java7_5_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Student[] student = new Student[4];
HashMap<String, Student> hs = new HashMap<String, Student>();
System.out.println("학생 이름, 학과, 학번, 학점평균을 입력하세요.");
for(int i=0; i<student.length; i++){
System.out.print(">> ");
String text = sc.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String name = st.nextToken().trim();
String major = st.nextToken().trim();
int num = Integer.parseInt(st.nextToken().trim());
double gpa = Double.parseDouble(st.nextToken().trim());
student[i] = new Student(name, major, num, gpa);
hs.put(name, student[i]);
}
Set<String> s = hs.keySet();
Iterator<String> it = s.iterator();
while(it.hasNext()) {
String name = it.next();
System.out.println("----------------------------------");
Student st = hs.get(name);
System.out.println("이름 : " + st.getName());
System.out.println("학과 : " + st.getMajor());
System.out.println("학번 : " + st.getNum());
System.out.println("학점평균 : " + st.getGpa());
}
System.out.println("----------------------------------");
while(true) {
System.out.print("학생 이름 >> ");
String name = sc.next();
if(name.equals("그만"))
break;
Student st = hs.get(name);
if(st==null){
System.out.println("해당 학생은 없습니다. 다시 검색하세요.");
}
else{
System.out.println(st.getName() + ", " + st.getMajor() + ", " +
st.getNum() + ", " + st.getGpa());
}
}
sc.close();
}
}
------------------------------------
학생 이름, 학과, 학번, 학점평균을 입력하세요.
>> 이승우, 모바일, 1, 4.1
>> 백승호, 안드로이드, 2, 3.9
>> 손흥민, 웹공학, 3, 3.5
>> 차범근, 빅데이터, 4, 4.25
----------------------------------
이름 : 차범근
학과 : 빅데이터
학번 : 4
학점평균 : 4.25
----------------------------------
이름 : 손흥민
학과 : 웹공학
학번 : 3
학점평균 : 3.5
----------------------------------
이름 : 백승호
학과 : 안드로이드
학번 : 2
학점평균 : 3.9
----------------------------------
이름 : 이승우
학과 : 모바일
학번 : 1
학점평균 : 4.1
----------------------------------
학생 이름 >> 이승우
이승우, 모바일, 1, 4.1
학생 이름 >> 백승호
백승호, 안드로이드, 2, 3.9
학생 이름 >> 손흥민
손흥민, 웹공학, 3, 3.5
학생 이름 >> 차범근
차범근, 빅데이터, 4, 4.25
학생 이름 >> 박주영
해당 학생은 없습니다. 다시 검색하세요.
학생 이름 >> 그만
[7장 6번]
도시 이름, 위도, 경도 정보를 가진 Location 클래스를 작성하고, 도시 이름을 '키'로 하는 HashMap<String, Location> 컬렉션을 만들고, 사용자로부터 입력 받아 4개의 도시를 저장하라. 그리고 도시 이름으로 검색하는 프로그램을 작성하라.
package Java7_6;
import java.util.*;
class Location{
private String city;
private int lati, longi; // 위도, 경도
Location(String city, int lati, int longi){
this.city = city;
this.lati = lati;
this.longi = longi;
}
String getCity(){
return city;
}
int getLati(){
return lati;
}
int getLongi(){
return longi;
}
}
public class Java7_6 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Location[] location = new Location[4];
HashMap<String, Location> hs = new HashMap<String, Location>();
System.out.println("도시, 경도, 위도를 입력하세요.");
for(int i=0; i<4; i++){
System.out.print(">> ");
String text = sc.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String city = st.nextToken().trim();
int lati = Integer.parseInt(st.nextToken().trim());
int longi = Integer.parseInt(st.nextToken().trim());
location[i] = new Location(city, lati, longi);
hs.put(city, location[i]);
}
Set<String> set = hs.keySet();
Iterator<String> it = set.iterator();
System.out.println("----------------------------------");
while(it.hasNext()){
String city = it.next();
Location s = hs.get(city);
System.out.println(s.getCity() + " " + s.getLati() + " " + s.getLongi());
}
System.out.println("----------------------------------");
while(true){
System.out.print("도시 이름 >> ");
String city = sc.next();
if(city.equals("그만"))
break;
Location s = hs.get(city);
if(s == null)
System.out.println(city + "는 없습니다.");
else{
System.out.println(s.getCity() + " " + s.getLati() + " " + s.getLongi());
}
}
sc.close();
}
}
-----------------------------------
도시, 경도, 위도를 입력하세요.
>> LA, 34, -118
>> 서울, 37, 126
>> 파리, 2, 48
>> 시드니, 151, -33
----------------------------------
서울 37 126
LA 34 -118
파리 2 48
시드니 151 -33
----------------------------------
도시 이름 >> LA
LA 34 -118
도시 이름 >> 서울
서울 37 126
도시 이름 >> 파리
파리 2 48
도시 이름 >> 시드니
시드니 151 -33
도시 이름 >> 로마
로마는 없습니다.
도시 이름 >> 그만
[7장 7번]
이름과 학점(4.5만점)을 5개 입력받아 해시맵에 저장하고, 장학생 선발 기준을 입력 받아 장학생 명단을 출력하라.
package Java7_7;
import java.util.*;
public class Java7_7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, Double> hs = new HashMap<String, Double>();
System.out.println("미래장학금관리시스템입니다.");
for(int i=0; i<5; i++){
System.out.print("이름과 학점 >> ");
String name = sc.next();
double gpa = sc.nextDouble();
hs.put(name, gpa);
}
System.out.print("장학생 선발 학점 기준 입력 >> ");
double standard = sc.nextDouble();
System.out.print("장학생 명단 : ");
Set<String> set = hs.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()){
String name = it.next();
double gpa = hs.get(name);
if(gpa>=standard)
System.out.print(name + " ");
}
}
}
------------------------------
미래장학금관리시스템입니다.
이름과 학점 >> 손흥민 3.1
이름과 학점 >> 차범근 2.4
이름과 학점 >> 이승우 4.3
이름과 학점 >> 백승호 3.9
이름과 학점 >> 박주영 4.0
장학생 선발 학점 기준 입력 >> 3.2
장학생 명단 : 박주영 백승호 이승우
[7장 8번]
고객의 이름과 포인트 점수를 관리하는 프로그램을 해시맵을 이용하여 작성하라. 프로그램은 고객의 이름과 포인트를 함께 저장 관리하는데, 포인트는 추가될 때마다 누적하여 저장된다.
package Java7_8;
import java.util.*;
public class Java7_8 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, Integer> hs = new HashMap<String, Integer>();
System.out.println("** 포인트 관리 프로그램입니다 **");
while(true){
System.out.print("이름과 포인트 입력 >> ");
String name = sc.next();
if(name.equals("그만"))
break;
int point = sc.nextInt();
if(hs.get(name) == null){
hs.put(name, point);
}
else{
hs.put(name, hs.get(name)+point);
}
Set<String> set = hs.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()){
String person = it.next();
int p_point = hs.get(person);
System.out.print("(" + person + "," + p_point + ")");
}
System.out.println();
}
}
}
---------------------------
** 포인트 관리 프로그램입니다 **
이름과 포인트 입력 >> 차범근 50
(차범근,50)
이름과 포인트 입력 >> 손흥민 200
(차범근,50)(손흥민,200)
이름과 포인트 입력 >> 이승우 150
(차범근,50)(손흥민,200)(이승우,150)
이름과 포인트 입력 >> 차범근 650
(차범근,700)(손흥민,200)(이승우,150)
이름과 포인트 입력 >> 박주영 300
(박주영,300)(차범근,700)(손흥민,200)(이승우,150)
이름과 포인트 입력 >> 그만
[7장 9번]
다음 Istack 인터페이스가 있다.
interface IStack<T> {
T pop();
boolean push(T ob);
}
IStack<T> 인터페이스를 구현(implements)하는 MyStack<T> 클래스를 작성하라. 스택의 원소는 Vector<E>를 이용하여 저장하라. 다음은 MyStack<Integer>로 구체화한 정수 스택을 생성하고 활용하는 코드와 실행 결과이다.
public class StackManager {
public static void main(String[] args) {
IStack<Integer> stack = new MyStack<Integer>();
for (int i=0; i<10; i++) stack.push(i);
while(true) {
Integer n = stack.pop();
if(n == null) break;
System.out.print(n+" ");
}
}
}
≫ 풀이
package Java7_9;
import java.util.*;
interface IStack<T> {
T pop();
boolean push(T ob);
}
class MyStack<T> implements IStack<T>{
private Vector<T> v;
public MyStack(){
v = new Vector<T>();
}
@Override
public T pop() {
if(v.size() == 0)
return null;
else
return v.remove(0);
}
@Override
public boolean push(T ob) {
v.add(0,ob);
return true;
}
}
public class StackManager {
public static void main(String[] args) {
IStack<Integer> stack = new MyStack<Integer>();
for (int i=0; i<10; i++) stack.push(i);
while(true) {
Integer n = stack.pop();
if(n == null) break;
System.out.print(n+" ");
}
}
}
-------------------------------
9 8 7 6 5 4 3 2 1 0
[7장 10번]
Vector<Shape>의 벡터를 이용하여 그래픽 편집기를 만들어보자. 본문 5.6절과 5.7절에서 사례로 든 추상 클래스 Shape과 Line, Rect, Circle 클래스 코드를 잘 완성하고 이를 활용하여 "삽입", "삭제", "모두 보기", "종료"의 4가지 그래픽 편집 기능을 프로그램을 작성하라. 6장 실습문제 6번을 Vector<Shape>을 이용하여 재작성하는 연습이다. Vector를 이용하면 6장 실습문제 6번보다 훨씬 간단히 작성됨을 경험할 수 있다.
package Java7_10;
import java.util.*;
abstract class Shape {
private Shape next;
public Shape() { next = null; }
public void setNext(Shape obj) { next = obj; } //링크 연결
public Shape getNext() { return next; }
public abstract void draw();
}
class Line extends Shape {
public void draw() {
System.out.println("Line");
}
}
class Rect extends Shape {
public void draw() {
System.out.println("Rect");
}
}
class Circle extends Shape {
public void draw() {
System.out.println("Circle");
}
}
public class Java7_10 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Vector<Shape> v = new Vector<Shape>();
Shape shape = null;
System.out.println("그래픽 에디터 beauty을 실행합니다.");
while(true) {
System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> ");
int select = sc.nextInt();
switch(select) {
case 1:
System.out.print("Line(1), Rect(2), Circle(3) >> ");
int choice = sc.nextInt();
switch(choice) {
case 1:
shape = new Line();
break;
case 2:
shape = new Rect();
break;
case 3:
shape = new Circle();
break;
}
v.add(shape);
break;
case 2:
System.out.print("삭제할 도형의 위치 >> " );
int position = sc.nextInt();
if(v.size() == 0 || v.size() <= position)
System.out.println("삭제할 수 없습니다.");
else
v.remove(position);
break;
case 3:
for(int i=0; i<v.size(); i++)
v.get(i).draw();
break;
case 4:
System.out.println("beauty을 종료합니다.");
sc.close();
return;
}
}
}
}
------------------------------
그래픽 에디터 beauty을 실행합니다.
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 1
Line(1), Rect(2), Circle(3) >> 2
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 1
Line(1), Rect(2), Circle(3) >> 3
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 1
Line(1), Rect(2), Circle(3) >> 1
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 3
Rect
Circle
Line
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 2
삭제할 도형의 위치 >> 3
삭제할 수 없습니다.
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 2
삭제할 도형의 위치 >> 1
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 3
Rect
Line
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 4
beauty을 종료합니다.
[7장 11번]
나라와 수도 맞추기 게임의 실행 예시는 다음과 같다.
(1) 나라 이름(country)과 수도(capital)로 구성된 Nation 클래스를 작성하고 Vecotr<Nation> 컬렉션을 이용하여 프로그램을 작성하라.
package Java7_11_1;
import java.util.*;
class Nation{
private String country, capital;
Nation(String country, String capital){
this.country = country;
this.capital = capital;
}
String getCountry(){
return country;
}
String getCapital(){
return capital;
}
}
public class CapitalGame {
private Scanner sc = new Scanner(System.in);
private Vector<Nation> v = new Vector<Nation>();
CapitalGame(){
v.add(new Nation("그리스", "아테네"));
v.add(new Nation("일본", "도쿄"));
v.add(new Nation("중국", "베이징"));
v.add(new Nation("멕시코", "멕시코시티"));
v.add(new Nation("영국", "런던"));
v.add(new Nation("독일", "베를린"));
v.add(new Nation("러시아", "모스크바"));
}
boolean exist(String country){
for(int i=0; i<v.size(); i++){
if(v.get(i).getCountry().equals(country))
return true;
}
return false;
}
void input(){
int n = v.size();
System.out.println("현재 " + n + "개 나라와 수도가 입력되어 있습니다.");
n++;
while(true){
System.out.print("나라와 수도 입력" + n + " >> ");
String country = sc.next();
if(country.equals("그만"))
break;
String capital = sc.next();
if(exist(country)){
System.out.println(country + "는 이미 있습니다!!");
continue;
}
v.add(new Nation(country, capital));
n++;
}
}
void quiz(){
while(true){
int index = (int)(Math.random()*v.size()); // 랜덤 나라 선택
Nation nation = v.get(index);
String question = nation.getCountry();
String answer = nation.getCapital();
System.out.print(question + "의 수도는? ");
String think = sc.next();
if(think.equals("그만"))
break;
if(answer.equals(think))
System.out.println("정답!!");
else
System.out.println("아닙니다!!");
}
}
void finish(){
System.out.println("게임을 종료합니다.");
}
void run(){
System.out.println("**** 수도 맞추기 게임을 시작합니다. ****");
while(true){
System.out.print("입력 : 1, 퀴즈 : 2, 종료 : 3 >> ");
int select = sc.nextInt();
switch(select){
case 1:
input();
break;
case 2:
quiz();
break;
case 3:
finish();
return;
default:
System.out.println("없는 메뉴입니다. 다시 입력하세요.");
}
}
}
public static void main(String[] args) {
CapitalGame game = new CapitalGame();
game.run();
}
}
-----------------------------------
**** 수도 맞추기 게임을 시작합니다. ****
입력 : 1, 퀴즈 : 2, 종료 : 3 >> 1
현재 7개 나라와 수도가 입력되어 있습니다.
나라와 수도 입력8 >> 한국 서울
나라와 수도 입력9 >> 그리스 아테네
그리스는 이미 있습니다!!
나라와 수도 입력9 >> 이탈리아 로마
나라와 수도 입력10 >> 호주 시드니
나라와 수도 입력11 >> 그만
입력 : 1, 퀴즈 : 2, 종료 : 3 >> 2
러시아의 수도는? 모스크바
정답!!
영국의 수도는? 런던
정답!!
호주의 수도는? 시드니
정답!!
영국의 수도는? 베를린
아닙니다!!
호주의 수도는? 멕시코시티
아닙니다!!
러시아의 수도는? 서울
아닙니다!!
영국의 수도는? 도쿄
아닙니다!!
일본의 수도는? 도쿄
정답!!
일본의 수도는? 그만
입력 : 1, 퀴즈 : 2, 종료 : 3 >> 3
게임을 종료합니다.
(2) 이 프로그램을 HashMap<String, String>을 이용하여 작성하라. '키'는 나라 이름이고 '값'은 수도이다.
package Java7_11_2;
import java.util.*;
public class CapitalGame2 {
private Scanner sc = new Scanner(System.in);
private HashMap<String, String> hs = new HashMap<String, String>();
public CapitalGame2(){
hs.put("그리스", "아테네");
hs.put("일본", "도쿄");
hs.put("중국", "베이징");
hs.put("멕시코", "멕시코시티");
hs.put("영국", "런던");
hs.put("독일", "베를린");
hs.put("러시아", "모스크바");
}
void input(){
int n = hs.size();
System.out.println("현재 " + n + "개 나라와 수도가 입력되어 있습니다.");
n++;
while(true){
System.out.print("나라와 수도 입력" + n + " >> ");
String country = sc.next();
if(country.equals("그만"))
break;
String capital = sc.next();
if(hs.containsKey(country)){
System.out.println(country + "는 이미 있습니다!!");
continue;
}
hs.put(country, capital);
n++;
}
}
void quiz(){
Set<String> keys = hs.keySet();
Object[] array = keys.toArray();
while(true){
int index = (int)(Math.random()*hs.size()); // 랜덤 나라 선택
String question = (String) array[index];
String answer = hs.get(question);
System.out.print(question + "의 수도는? ");
String think = sc.next();
if(think.equals("그만"))
break;
if(answer.equals(think))
System.out.println("정답!!");
else
System.out.println("아닙니다!!");
}
}
void finish(){
System.out.println("게임을 종료합니다.");
}
void run(){
System.out.println("**** 수도 맞추기 게임을 시작합니다. ****");
while(true){
System.out.print("입력 : 1, 퀴즈 : 2, 종료 : 3 >> ");
int select = sc.nextInt();
switch(select){
case 1:
input();
break;
case 2:
quiz();
break;
case 3:
finish();
return;
default:
System.out.println("없는 메뉴입니다. 다시 입력하세요.");
}
}
}
public static void main(String[] args) {
CapitalGame2 game = new CapitalGame2();
game.run();
}
}
-------------------------------------
**** 수도 맞추기 게임을 시작합니다. ****
입력 : 1, 퀴즈 : 2, 종료 : 3 >> 1
현재 7개 나라와 수도가 입력되어 있습니다.
나라와 수도 입력8 >> 한국 서울
나라와 수도 입력9 >> 그리스 아테네
그리스는 이미 있습니다!!
나라와 수도 입력9 >> 일본 도쿄
일본는 이미 있습니다!!
나라와 수도 입력9 >> 영국 런던
영국는 이미 있습니다!!
나라와 수도 입력9 >> 이탈리아 로마
나라와 수도 입력10 >> 호주 시드니
나라와 수도 입력11 >> 그만
입력 : 1, 퀴즈 : 2, 종료 : 3 >> 2
독일의 수도는? 베르릴ㄴ
아닙니다!!
그리스의 수도는? 아테네
정답!!
그리스의 수도는? 아테네
정답!!
이탈리아의 수도는? 로마
정답!!
중국의 수도는? 베이징
정답!!
독일의 수도는? 베를린
정답!!
멕시코의 수도는? 멕시코시티
정답!!
한국의 수도는? 그만
입력 : 1, 퀴즈 : 2, 종료 : 3 >> 3
게임을 종료합니다.
[7장 12번]
Open Challenge를 수정하여 사용자가 단어를 삽입할 수 있도록 기능을 추가하라.
package Java7_12;
import java.util.*;
//import static java.lang.System.exit;
class Word{
private String eng, kor;
Word(String eng, String kor){
this.eng = eng;
this.kor = kor;
}
String getEng(){
return eng;
}
String getKor(){
return kor;
}
}
public class WordTest {
Scanner sc = new Scanner(System.in);
Vector<Word> v = new Vector<Word>();
int[] r_quiz = new int[4];
WordTest(){
v.add(new Word("love", "사랑"));
v.add(new Word("animal", "동물"));
v.add(new Word("picture", "그림"));
v.add(new Word("emotion", "감정"));
v.add(new Word("baby", "아기"));
v.add(new Word("error", "오류"));
v.add(new Word("society", "사회"));
v.add(new Word("doll", "인형"));
v.add(new Word("bear", "곰"));
v.add(new Word("example", "보기"));
v.add(new Word("deal", "거래"));
v.add(new Word("photo", "사진"));
v.add(new Word("human", "인간"));
v.add(new Word("statue", "조각상"));
v.add(new Word("eye", "눈"));
v.add(new Word("hand", "손"));
v.add(new Word("ant", "개미"));
v.add(new Word("resume", "이력서"));
v.add(new Word("concern", "걱정"));
v.add(new Word("bad", "나쁜"));
v.add(new Word("developer", "개발자"));
v.add(new Word("word", "단어"));
}
void quiz(){
while(true){
make();
int answerNum = (int)(Math.random()*4); // 0 1 2 3중 정답번호 생성
int answerIndex = r_quiz[answerNum]; // v.size() 중 랜덤 정수 4개 저장된 r_quiz에서 정답번호 index 설정
// ex) r_quiz[10, 5, 2, 9], answerNum = 1 -> answerIndex = 5
System.out.println(v.get(answerIndex).getEng() + "?"); // ex) v.get(5).getEng()
for(int i=0; i<r_quiz.length; i++){
System.out.print("(" + (i+1) + ")");
System.out.print(v.get(r_quiz[i]).getKor() + " ");
// 1. v.get(10) 2. v.get(5) 3. v.get(2) 4. v.get(9)
}
System.out.print(" >> ");
try{
int userSelect = sc.nextInt();
if(userSelect == -1) {
System.out.println();
break;
}
else if(userSelect<1 || userSelect >4)
System.out.println("다시 입력하세요\n");
else if((userSelect-1) == answerNum)
System.out.println("Excellent!!\n");
else
System.out.println("No....\n");
}
catch(InputMismatchException e){
sc.next(); // 현재 스트림 버퍼에 입력되어 있는 입력 제거
System.out.println("숫자를 입력하세요 !!\n");
}
}
}
void make(){
for(int i=0; i<4; i++){
r_quiz[i] = (int)(Math.random()*v.size()); // r_quiz에 랜덤 숫자 4개 저장
for(int j=0; j<i; j++){
if(r_quiz[j] == r_quiz[i]){
i--;
continue;
}
}
}
}
void finish(){
System.out.println("\"명품영어\"를 종료합니다.");
}
void insert(){
while(true){
System.out.print("영어 한글 입력 >> ");
String eng = sc.next();
if(eng.equals("그만")) {
System.out.println();
break;
}
String kor = sc.next();
int count = 0;
for(int i=0; i<v.size(); i++){
String tmp = v.get(i).getEng();
if (tmp.equals(eng)) {
System.out.println("이미 있는 단어입니다.");
}
else{
count++;
}
}
if(count == v.size())
v.add(new Word(eng, kor));
}
}
void run(){
System.out.println("**** 영어 단어 테스트 프로그램 \"명품영어\" 입니다. ****");
while(true){
System.out.print("단어 테스트 : 1, 단어 삽입 : 2, 종료 : 3 >> ");
int n = sc.nextInt();
switch(n){
case 1:
System.out.println("현재 " + v.size() + "개의 단어가 들어 있습니다. -1을 입력하면 종료합니다.\n");
quiz();
break;
case 2:
System.out.println("영어 단어에 그만을 입력하면 입력을 종료합니다.");
insert();
break;
case 3:
finish();
return;
default:
System.out.println("잘못 입력하였습니다");
}
}
}
public static void main(String[] args) {
WordTest wt = new WordTest();
wt.run();
}
}
--------------------------------------------
**** 영어 단어 테스트 프로그램 "명품영어" 입니다. ****
단어 테스트 : 1, 단어 삽입 : 2, 종료 : 3 >> 1
현재 22개의 단어가 들어 있습니다. -1을 입력하면 종료합니다.
animal?
(1)조각상 (2)개미 (3)동물 (4)곰 >> 3
Excellent!!
doll?
(1)동물 (2)단어 (3)조각상 (4)인형 >> 1
No....
photo?
(1)사진 (2)조각상 (3)걱정 (4)손 >> asdf
숫자를 입력하세요 !!
ant?
(1)나쁜 (2)인간 (3)거래 (4)개미 >> ㅂㅈㄷㄱ
숫자를 입력하세요 !!
emotion?
(1)인형 (2)감정 (3)손 (4)나쁜 >> 5
다시 입력하세요
eye?
(1)개발자 (2)눈 (3)오류 (4)인형 >> -1
단어 테스트 : 1, 단어 삽입 : 2, 종료 : 3 >> 2
영어 단어에 그만을 입력하면 입력을 종료합니다.
영어 한글 입력 >> baby 아기
이미 있는 단어입니다.
영어 한글 입력 >> flag 깃발
영어 한글 입력 >> 그만
단어 테스트 : 1, 단어 삽입 : 2, 종료 : 3 >> 1
현재 23개의 단어가 들어 있습니다. -1을 입력하면 종료합니다.
love?
(1)사진 (2)그림 (3)인형 (4)사랑 >> -1
단어 테스트 : 1, 단어 삽입 : 2, 종료 : 3 >> 3
"명품영어"를 종료합니다.