본문 바로가기
Solution_/명품 java

[명품 JAVA] 7장 실습문제(5~11) (제네릭과 컬렉션)

by 낭람_ 2019. 9. 22.
반응형

[7장 6번]

도시 이름, 위도, 경도 정보를 가진 Location 클래스를 작성하고, 도시 이름을 '키'로 하는 HashMap<String, Location> 컬렉션을 만들고, 사용자로부터 입력 받아 4개의 도시를 저장하라. 그리고 도시 이름으로 검색하는 프로그램을 작성하라.

도시, 경도, 위도를 입력하세요.

>> 서울, 37, 126

>> LA, 34, -118

>> 파리, 2, 48

>> 시드니, 151, -33

----------------------------------

서울 37 126

LA 34 -118

파리 2 48

시드니 151 -33

----------------------------------

도시 이름 >> 피리

피리는 없습니다.

도시 이름 >> 파리

파리 2 48

도시 이름 >> 그만


[풀이]

import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;
public class Prac_06 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Location[] location = new Location[4];
HashMap<String, Location> manage = new HashMap<String, Location>();
System.out.println("도시, 경도, 위도를 입력하세요.");
for(int i=0; i<location.length; i++) {
System.out.print(">> ");
String text = sc.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String city = st.nextToken().trim();
int longitude = Integer.parseInt(st.nextToken().trim());
int latitude = Integer.parseInt(st.nextToken().trim());
location[i] = new Location(city, longitude, latitude);
manage.put(city, location[i]); // ArrayList에 저장
}
Set<String> key = manage.keySet();
Iterator<String> it = key.iterator();
System.out.println("----------------------------------");
while(it.hasNext()) {
String city = it.next();
Location s = manage.get(city);
System.out.println(s.get_city() +" "+s.get_longitude()+" "+s.get_latitude());
}
System.out.println("----------------------------------");
while(true) {
System.out.print("도시 이름 >> ");
String city = sc.next();
if(city.equals("그만"))
break;
Location s = manage.get(city);
if( s == null)
System.out.println(city+"는 없습니다.");
else
s.find_location(city);
}
sc.close();
}
}


[7장 7번]

이름과 학점(4.5만점)을 5개 입력받아 해시맵에 저장하고, 장학생 선발 기준을 입력 받아 장학생 명단을 출력하라.

미래장학금관리시스템입니다.

이름과 학점 >> 적당히 3.1

이름과 학점 >> 나탈락 2.4

이름과 학점 >> 최고조 4.3

이름과 학점 >> 상당히 3.9

이름과 학점 >> 고득점 4.0

장학생 선발 학점 기준 입력 >> 3.2

장학생 명단 : 최고조 상당히 고득점 

[Hint] HashMap의 전체 요소를 검색하여 학점이 3.2 이상인 학생을 알아내야 한다. 예제 7-6은 해시맵 전체를 검색하는 코드 사례를 보여준다.


[풀이]

import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class chap07_prac07 {
public static void main(String[] args) {
HashMap<String, Double> manage = new HashMap<String, Double>();
Scanner sc = new Scanner(System.in);
System.out.println("미래장학금관리시스템입니다.");
for(int i=0; i<5; i++) {
System.out.print("이름과 학점 >> ");
String name = sc.next();
double score = sc.nextDouble();
manage.put(name, score);
}
System.out.print("장학생 선발 학점 기준 입력 >> ");
double cutline = sc.nextDouble();
System.out.print("장학생 명단 : ");
Set<String> nameSet = manage.keySet();
Iterator<String> it = nameSet.iterator();
while(it.hasNext()) {
String name = it.next();
double score = manage.get(name);
if(score > cutline)
System.out.print(name+ " ");
}
System.out.println();
sc.close();
}
}


[7장 8번]

고객의 이름과 포인트 점수를 관리하는 프로그램을 해시맵을 이용하여 작성하라. 프로그램은 고객의 이름과 포인트를 함께 저장 관리하는데, 포인트는 추가될 때마다 누적하여 저장된다.

** 포인트 관리 프로그램입니다 **

이름과 포인트 입력 >> 이재문 40

(이재문,40)

이름과 포인트 입력 >> 황기태 50

(이재문,40)(황기태,50)

이름과 포인트 입력 >> 황기태 60

(이재문,40)(황기태,110)

이름과 포인트 입력 >> 김남윤 30

(이재문,40)(김남윤,30)(황기태,110)

이름과 포인트 입력 >> 이재문 20

(이재문,60)(김남윤,30)(황기태,110)

이름과 포인트 입력 >> 그만


[풀이]

import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class Prac08 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, Integer> manage = 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(manage.get(name) == null) {
manage.put(name, point);
}
else {
manage.put(name, manage.get(name)+point);
}
Set<String> key = manage.keySet();
Iterator<String> it = key.iterator();
while(it.hasNext()) {
String people = it.next();
Integer sum = manage.get(people);
System.out.print("("+people+","+sum+")");
}
System.out.println();
}
sc.close();
}
}


[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+" ");
}
}
}

9 8 7 6 5 4 3 2 1 0 


[풀이]

import java.util.ArrayList;
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+" ");
}
}
}
interface IStack<T> {
T pop();
boolean push(T ob);
}
class MyStack<T> implements IStack<T> {
ArrayList<T> l = null;
public MyStack() {
l = new ArrayList<T>();
}
public T pop() {
if (l.size() == 0)
return null;
else
return l.remove(0);
}
public boolean push(T ob) {
l.add(0, ob);
return true;
}
}


[7장 10번]

Vector<Shape>의 벡터를 이용하여 그래픽 편집기를 만들어보자. 본문 5.6절과 5.7절에서 사례로 든 추상 클래스 Shape과 Line, Rect, Circle 클래스 코드를 잘 완성하고 이를 활용하여 "삽입", "삭제", "모두 보기", "종료"의 4가지 그래픽 편집 기능을 프로그램을 작성하라. 6장 실습문제 6번을 Vector<Shape>을 이용하여 재작성하는 연습이다. Vector를 이용하면 6장 실습문제 6번보다 훨씬 간단히 작성됨을 경험할 수 있다.

그래픽 에디터 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) >> 2

삭제할 도형의 위치 >> 3

삭제할 수 없습니다.

삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 4

beauty을 종료합니다.


[풀이]

import java.util.Scanner;
import java.util.Vector;
public class Prac {
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;
}
}
}
}
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");
}
}


[7장 11번]

나라와 수도 맞추기 게임의 실행 예시는 다음과 같다.

**** 수도 맞추기 게임을 시작합니다. ****

입력:1, 퀴즈:2, 종료:3>> 1

현재 9개 나라와 수도가 입력되어 있습니다.

나라와 수도 입력10>> 한국 서울

나라와 수도 입력11>> 그리스 아테네

그리스는 이미 있습니다!

나라와 수도 입력11>> 호주 시드니

나라와 수도 입력12>> 이탈리아 로마

나라와 수도 입력13>> 그만

입력:1, 퀴즈:2, 종료:3>> 2

일본의 수도는? 동경

정답!!

스페인의 수도는? 하얼빈

아닙니다!!

프랑스의 수도는? 파리

정답!!

중국의 수도는? 베이징

정답!!

스페인의 수도는? 그만

입력:1, 퀴즈:2, 종료:3>> 3

게임을 종료합니다.

(1) 나라 이름(country)과 수도(capital)로 구성된 Nation 클래스를 작성하고 Vecotr<Nation> 컬렉션을 이용하여 프로그램을 작성하라.

import java.util.Scanner;
import java.util.Vector;
public class CapitalGame {
private Vector<Nation> store = new Vector<Nation>();
private Scanner scanner = new Scanner(System.in);
public CapitalGame() {
// store에 9 개의 아이템을 입력하여 초기화
store.add(new Nation("멕시코", "멕시코시티"));
store.add(new Nation("스페인", "리스본"));
store.add(new Nation("프랑스", "파리"));
store.add(new Nation("영국", "런던"));
store.add(new Nation("그리스", "아테네"));
store.add(new Nation("독일", "베를린"));
store.add(new Nation("일본", "동경"));
store.add(new Nation("중국", "베이징"));
store.add(new Nation("러시아", "모스크바"));
}
private void error(String msg) {
System.out.println(msg);
}
public void run() {
System.out.println("**** 수도 맞추기 게임을 시작합니다. ****");
while(true) {
System.out.print("입력:1, 퀴즈:2, 종료:3>> ");
int menu = scanner.nextInt();
switch(menu) {
case 1: input(); break;
case 2: quiz(); break;
case 3: finish(); return;
default:
error("잘못된 입력입니다.");
}
}
}
private boolean contains(String country) {
for(int i=0; i<store.size(); i++) {
if(store.get(i).getCountry().equals(country)) { // 사용자가 입력한 나라가 이미 있다면
return true;
}
}
return false;
}
private void input() {
int n = store.size();
System.out.println("현재 " + n + "개 나라와 수도가 입력되어 있습니다.");
n++;
while(true) {
System.out.print("나라와 수도 입력" + n + ">> ");
String country = scanner.next(); // 사용자 입력 나라
if(country.equals("그만")) {
break;
}
String capital = scanner.next(); // 사용자 입력, 수도
if(contains(country)) { // 사용자가 입력한 나라가 이미 있다면
System.out.println(country + "는 이미 있습니다!");
continue;
}
store.add(new Nation(country, capital));
n++;
}
}
private void quiz() {
// 모든 키(나라)를 알아낸다.
while(true) {
// 나라 중에서 하나를 선택한다.
int index = (int)(Math.random()*store.size()); // 랜덤한 위치 결정
// 문제(나라)와 정답(수도)을 결정한다.
Nation nation = store.get(index);
String question = nation.getCountry();
String answer = nation.getCapital();
// 문제를 출력한다.
System.out.print(question + "의 수도는? ");
String capitalFromUser = scanner.next(); // 사용자의 입력
if(capitalFromUser.equals("그만")) {
break;
}
if(capitalFromUser.equals(answer))
System.out.println("정답!!");
else
System.out.println("아닙니다!!");
}
}
private void finish() {
System.out.println("게임을 종료합니다.");
}
public static void main(String[] args) {
CapitalGame game = new CapitalGame();
game.run();
}
}
class Nation {
private String country;
private String capital;
public Nation(String country, String capital) {
this.country = country;
this.capital = capital;
}
public String getCountry() {
return country;
}
public String getCapital() {
return capital;
}
}

(2) 이 프로그램을 HahsMap<String, String>을 이용하여 작성하라. '키'는 나라 이름이고 '값'은 수도이다.

import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
public class CapitalGame {
private HashMap<String, String> store = new HashMap<String, String>();
private Scanner scanner = new Scanner(System.in);
public CapitalGame() {
// store에 9 개의 아이템을 입력하여 초기화
store.put("멕시코", "멕시코시티");
store.put("스페인", "리스본");
store.put("프랑스", "파리");
store.put("영국", "런던");
store.put("그리스", "아테네");
store.put("독일", "베를린");
store.put("일본", "동경");
store.put("중국", "베이찡");
store.put("러시아", "모스크바");
}
private void error(String msg) {
System.out.println(msg);
}
public void run() {
System.out.println("**** 수도 맞추기 게임을 시작합니다. ****");
while(true) {
System.out.print("입력:1, 퀴즈:2, 종료:3>> ");
int menu = scanner.nextInt();
switch(menu) {
case 1: input(); break;
case 2: quiz(); break;
case 3: finish(); return;
default:
error("잘못된 입력입니다.");
}
}
}
private void input() {
int n = store.size();
System.out.println("현재 " + n + "개 나라와 수도가 입력되어 있습니다.");
n++;
while(true) {
System.out.print("나라와 수도 입력" + n + ">> ");
String country = scanner.next();
if(country.equals("그만")) {
break;
}
String capital = scanner.next();
if(store.containsKey(country)) {
System.out.println(country + "는 이미 있습니다");
continue;
}
store.put(country, capital);
n++;
}
}
private void quiz() {
// 모든 키(나라)를 알아낸다.
Set<String> keys = store.keySet();
Object [] array = (keys.toArray());
while(true) {
// 나라 중에서 하나를 선택한다.
int index = (int)(Math.random()*array.length); // 랜덤한 위치 결정
// 문제(나라)와 정답(수도)을 결정한다.
String question = (String)array[index];
String answer = store.get(question);
// 문제를 출력한다.
System.out.print(question + "의 수도는? ");
String capitalFromUser = scanner.next(); // 사용자의 입력
if(capitalFromUser.equals("그만")) {
break;
}
if(capitalFromUser.equals(answer))
System.out.println("정답!!");
else
System.out.println("아닙니다!!");
}
}
private void finish() {
System.out.println("게임을 종료합니다.");
}
public static void main(String[] args) {
CapitalGame game = new CapitalGame();
game.run();
}
}


반응형

댓글