Java:Ch7 실습 문제

aiden·2023년 9월 14일

Java

목록 보기
14/30

#8

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

** 포인트 관리 프로그램입니다 **
이름과 포인트 입력 >> 이재문 40
(이재문,40)
이름과 포인트 입력 >> 황기태 50
(이재문,40)(황기태,50)
이름과 포인트 입력 >> 황기태 60
(이재문,40)(황기태,110)
이름과 포인트 입력 >> 김남윤 30
(이재문,40)(김남윤,30)(황기태,110)
이름과 포인트 입력 >> 이재문 20
(이재문,60)(김남윤,30)(황기태,110)
이름과 포인트 입력 >> 그만

package main;

import java.util.*;

public class Practice {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        HashMap<String, Integer> customer = new HashMap<>();
        Set<String> keys;
        Iterator<String> it;

        System.out.println("** 포인트 관리 프로그램입니다 **");
        while(true){
            System.out.print("이름과 포인트 입력 >> ");
            String name = scanner.next();
            if(name.equals("그만")) break;
            else{
                int point = scanner.nextInt();
                if(customer.containsKey(name)){ //이미 있는 이름의 경우
                    point = customer.get(name) + point; //포인트 누적
                }
                customer.put(name, point);
                keys = customer.keySet();
                it = keys.iterator();
                while (it.hasNext()){
                    String key = it.next();
                    int value = customer.get(key);
                    System.out.print("(" + key + ", " + value + ") ");
                }
                System.out.println();
            }
        }

        scanner.close();
    }
}

포인트 관리 프로그램입니다
이름과 포인트 입력 >> 이재문 40
(이재문, 40)
이름과 포인트 입력 >> 황기태 50
(이재문, 40) (황기태, 50)
이름과 포인트 입력 >> 황기태 60
(이재문, 40) (황기태, 110)
이름과 포인트 입력 >> 김남윤 30
(이재문, 40) (김남윤, 30) (황기태, 110)
이름과 포인트 입력 >> 이재문 20
(이재문, 60) (김남윤, 30) (황기태, 110)
이름과 포인트 입력 >> 그만


해시맵 키의 value를 갱신하고 싶은 경우, 동일하게 put() 메소드를 이용한다.

#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); //10개의 정수 푸시
		while(true) { //스택이 빌 때까지 pop
			Integer  n = stack.pop();
			if(n == null) break; //스택이 빈 경우
			System.out.print(n+" ");
		}
	}
}

9 8 7 6 5 4 3 2 1 0

package main;

import java.util.*;

interface IStack<T> {
    T pop();
    boolean push(T ob);
}

class MyStack<T> implements IStack<T>{
    Vector<T> elem = new Vector<>();
    int top = -1;
    public T pop(){
        if(top == -1) return null;
        T val = elem.get(top);
        elem.remove(top--);
        return val;
    }
    public boolean push(T ob){
        elem.add(ob);
        top++;
        return true;
    }
}

public class Practice {
    public static void main(String[] args) {
        IStack<Integer> stack = new MyStack<Integer>();
        for (int i=0; i<10; i++) stack.push(i); //10개의 정수 푸시
        while(true) { //스택이 빌 때까지 pop
            Integer  n = stack.pop();
            if(n == null) break; //스택이 빈 경우
            System.out.print(n+" ");
        }
    }
}

9 8 7 6 5 4 3 2 1 0

#11

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

** 수도 맞추기 게임을 시작합니다. **
입력:1, 퀴즈:2, 종료:3>> 1
현재 9개 나라와 수도가 입력되어 있습니다.
나라와 수도 입력10>> 한국 서울
나라와 수도 입력11>> 그리스 아테네
그리스는 이미 있습니다!
나라와 수도 입력11>> 호주 시드니
나라와 수도 입력12>> 이탈리아 로마
나라와 수도 입력13>> 그만
입력:1, 퀴즈:2, 종료:3>> 2
호주의 수도는? 시드니
정답!!
독일의 수도는? 하얼빈
아닙니다!!
멕시코의 수도는? 멕시코시티
정답!!
이탈리아의 수도는? 로마
정답!!
한국의 수도는? 서울
정답!!
영국의 수도는? 런던
정답!!
중국의 수도는? 그만
입력:1, 퀴즈:2, 종료:3>> 3
게임을 종료합니다.

(1) 나라 이름(country)과 수도(capital)로 구성된 Nation 클래스를 작성하고 Vector<Nation> 컬렉션을 이용하여 프로그램을 작성하라.
(2) 이 프로그램을 HahsMap<String, String>을 이용하여 작성하라. '키'는 나라 이름이고 '값'은 수도이다.

(1)

package main;

import java.util.*;

class Nation{
    String country;
    String capital;

    public Nation(String country, String capital){this.country = country; this.capital = capital;}
}

public class Practice {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Iterator<Nation> it;

        Vector<Nation> v = new Vector<>();
        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("베트남", "하노이"));
        v.add(new Nation("태국", "방콕"));
        v.add(new Nation("브라질", "브라질리아"));

        System.out.println("**** 수도 맞추기 게임을 시작합니다. ****");
        while (true) {
            System.out.print("입력:1, 퀴즈:2, 종료:3>> ");
            int opt = scanner.nextInt();
            if (opt == 1) {
                System.out.println("현재 " + v.size() + "개 나라와 수도가 입력되어 있습니다.");
                while (true) {
                    int check = 0; //벡터에 존재하는지 아닌지 체크
                    System.out.print("나라와 수도 입력" + (v.size() + 1) + ">>");
                    String country = scanner.next();
                    if(country.equals("그만")) break;
                    String capital = scanner.next();
                    it = v.iterator();
                    while (it.hasNext()){
                        Nation n = it.next();
                        if(country.equals(n.country)){ //이미 존재하는 경우
                            System.out.println(country + "는 이미 있습니다!");
                            check++;
                            break;
                        }
                    }
                    if(check == 0){
                        v.add(new Nation(country, capital));
                    }
                }
            }
            else if (opt == 2) {
                it = v.iterator();
                while (it.hasNext()) {
                    Nation n = it.next();
                    System.out.print(n.country + "의 수도는? ");
                    String answer = scanner.next();
                    if(answer.equals("그만")) break;
                    else if (answer.equals(n.capital)) {
                        System.out.println("정답!!");
                    }
                    else{
                        System.out.println("아닙니다!!");
                    }
                }
            }
            else if (opt == 3) {
                System.out.println("게임을 종료합니다.");
                break;
            }
            else{
                System.out.println("바른 번호를 입력하세요");
            }
        }
        scanner.close();
    }
}

**** 수도 맞추기 게임을 시작합니다. ****
입력:1, 퀴즈:2, 종료:3>> 1
현재 9개 나라와 수도가 입력되어 있습니다.
나라와 수도 입력10>>한국 서울
나라와 수도 입력11>>그리스 아테네
그리스는 이미 있습니다!
나라와 수도 입력11>>호주 시드니
나라와 수도 입력12>>이탈리아 로마
나라와 수도 입력13>>그만
입력:1, 퀴즈:2, 종료:3>> 2
그리스의 수도는? 아테네
정답!!
독일의 수도는? 아테네
아닙니다!!
멕시코의 수도는? 멕시코시티
정답!!
영국의 수도는? 런던
정답!!
일본의 수도는? 그만
입력:1, 퀴즈:2, 종료:3>> 3
게임을 종료합니다.

(2)

package main;

import java.util.*;

public class Practice {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        HashMap<String, String> h = new HashMap<String, String>();
        Iterator<String> it;

        h.put("그리스", "아테네");
        h.put("독일", "베를린");
        h.put("멕시코", "멕시코시티");
        h.put("영국", "런던");
        h.put("일본", "도쿄");
        h.put("증국", "베이징");
        h.put("베트남", "하노이");
        h.put("태국", "방콕");
        h.put("브라질", "브라질리아");

        System.out.println("**** 수도 맞추기 게임을 시작합니다. ****");
        while (true) {
            System.out.print("입력:1, 퀴즈:2, 종료:3>> ");
            int opt = scanner.nextInt();
            if (opt == 1) {
                System.out.println("현재 " + h.size() + "개 나라와 수도가 입력되어 있습니다.");
                while (true) {
                    System.out.print("나라와 수도 입력" + (h.size() + 1) + ">>");
                    String country = scanner.next();
                    if(country.equals("그만")) break;
                    String capital = scanner.next();
                    if(h.containsKey(country)){ //이미 존재하는 경우
                        System.out.println(country + "는 이미 있습니다!");
                        continue;
                    }
                    h.put(country, capital);
                }
            }
            else if (opt == 2) {
                Set<String> keys = h.keySet();
                it = keys.iterator();
                while (it.hasNext()) {
                    String country = it.next();
                    System.out.print(country + "의 수도는? ");
                    String answer = scanner.next();
                    if(answer.equals("그만")) break;
                    else if (answer.equals(h.get(country))) {
                        System.out.println("정답!!");
                    }
                    else{
                        System.out.println("아닙니다!!");
                    }
                }
            }
            else if (opt == 3) {
                System.out.println("게임을 종료합니다.");
                break;
            }
            else{
                System.out.println("바른 번호를 입력하세요");
            }
        }
        scanner.close();
    }
}

**** 수도 맞추기 게임을 시작합니다. ****
입력:1, 퀴즈:2, 종료:3>> 1
현재 9개 나라와 수도가 입력되어 있습니다.
나라와 수도 입력10>>한국 서울
나라와 수도 입력11>>그리스 아테네
그리스는 이미 있습니다!
나라와 수도 입력11>>호주 시드니
나라와 수도 입력12>>이탈리아 로마
나라와 수도 입력13>>그만
입력:1, 퀴즈:2, 종료:3>> 2
독일의 수도는? 베를린
정답!!
그리스의 수도는? 베를린
아닙니다!!
영국의 수도는? 런던
정답!!
일본의 수도는? 그만
입력:1, 퀴즈:2, 종료:3>> 3
게임을 종료합니다.


1번 풀이는 내가 너무 복잡하게 푼 것 같아서 뭔가 만족스럽지가 않았다. 어떤게 더 좋은 풀이였을까 계속 고민해보고 싶은 문제였다.

2번에서 같은 문제를 해시맵으로 해결하자 훨씬 간결하고 중첩문도 많이 제거되었다.

#13(추후 풀이)

명령을 실행하는 소프트웨어를 작성하라. 명령은 다음과 같이 mov, add, sub, jn0, prt로 구성되며 mov sum 0은 sum 변수에 0을 삽입하고, add sum i는 sum 변수에 i 값을 더하며, sub n 1은 n 변수의 값을 1 감소시키고, jn0 n 3은 변수 n의 값이 0이 아니면 3번째 명령(실제 4번째 줄)으로 돌아가도록 처리하고, prt sum 0은 sum 변수의 값을 출력하고 프로그램을 종료한다. prt에서 마지막 0은 특별한 의미가 없다. go는 지금까지 입력한 프로그램을 처음부터 실행하도록 하는 지시어이다.

profile
파인애플 좋아하세요?

0개의 댓글