히치키치

[명품 자바 에센셜] 실습문제 7장 본문

명품 자바 에센셜

[명품 자바 에센셜] 실습문제 7장

히치키치 2021. 9. 1. 00:39

요약

  • Vector는 null 추가 가능
  • 컬렉션 : 요소의 리스트 / 집합 관리 자료구조, 크기 자동 조절 가능
  • 제네릭 : 일반화 시킨 타입의 매개 변수를 이용해 클래스, 인터페이스, 메소드를 일반화함, 구체적인 타입 지정해 특정 타입으로만 사용 가능
  • ArrayList<_E_ >Vector<_E_ >와 달리 멀티스레드 동기화 지원 X
  • Vector <Integer> v=new Vector<Integer>(3);에서 capacity는 3이지만 size는 아직 추가된 원소가 없어 0임
  • .add().get()에서 발생하는 자동 박싱/언박싱
  • if (this.x.equals(x))로 값 비교해야함. if(this.x==x)는 레퍼런스 비교임
  • iterator 돌면서 최대/최소 구할 때 범위와 index 설정 주의

1번

Scanner를 사용하여 5개의 실수 값을 사용자로부터 입력받아 벡터에 저장하라. 그리고 나서 벡터를 검색하여 가장 큰 수를 출력하는 프로그램을 작성하라.


import java.util.*;

public class one {

    public static void main(String[] args) {
        Vector<Float> v=new Vector<Float>();
        Scanner sc=new Scanner(System.in);
        for(int i=0;i<5;i++) {
            v.add(sc.nextFloat());
        }
        float max=-1000000000;
        for(int i=0;i<4;i++) { 
            //비교하는 index : (0,1) (1,2) (2,3) (3,4)
            if(v.get(i)>v.get(i+1)) {
                max=v.get(i);
            }
        }

        System.out.println("가장 큰 수는 " + max);

    }

}

2번

Scanner를 사용하여 학점 (‘A’, ‘B’, ‘C’, ‘D’, ‘F’)을 5개만 문자로 입력받아 ArrayList에 저장하라. 그리고 나서 다시 ArrayList를 검색하여 5개의 학점을 점수(A = 4.0, B = 3.0, C = 2.0, E = 1.0, F = 0.0)로 변환하여 출력하는 프로그램을 작성하라.


import java.util.*;

public class two {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        ArrayList<Character>grade=new ArrayList<Character>();
        //!! char -> Character로 표현하는 기억!!

        System.out.print("학점 5개 입력>>");
        for(int i=0;i<5;i++) {//성적 5개 입력
            String string=sc.next();
            //!! String으로 입력받은 단어에서 인텍스 0인 글자 따로 char로 가져오기!!
            char alpha=string.charAt(0);
            //grade ArrayList에 입력
            grade.add(alpha);
        }

        for(int i=0;i<grade.size();i++) {
            //!! iteration 횟수 5로 하기보다는 .size() 이용하기 !!
            if(grade.get(i)=='A') {
                System.out.print(4.0);
            }
            else if(grade.get(i)=='B') {
                System.out.print(3.0);
            }
            else if(grade.get(i)=='C') {
                System.out.print(2.0);
            }
            else if (grade.get(i)=='D') {
                System.out.print(1.0);
            }
            else if(grade.get(i)=='F') {
                System.out.print(0.0);
            }
            else {
                System.out.print("잘못된 입력입니다.");
            }
            System.out.print(" ");
        }
    }
}

3번

HashMap<String, Integer> 컬렉션을 생성하고 “에스프레소”는 2000, “아메리카노”는 2500, “카푸치노”는 3000, “카페라테”는 3500을 저장하라. 그리고 다음과 같이 음료수 이름을 입력받으면 HashMap에서 검색하여 가격을 출력하라.


import java.util.*;

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

        Scanner sc=new Scanner(System.in);

        HashMap<String, Integer>menu=new HashMap<String, Integer>();
        menu.put("에스프레소", 2000);
        menu.put("아메리카노", 2500);
        menu.put("카푸치노", 3000);
        menu.put("카페라떼", 3500);

        Set<String>keys=menu.keySet();

        System.out.println("에스프레소, 카푸치노, 아메리카노, 카페라떼 있습니다.");


        while(true) {
            Iterator<String>it=keys.iterator();
            //!! iterator 한 바퀴 다 돌고 새롭게 만들어 줘야 또 돌면서 value값 탐색 가능 !!
            System.out.print("주문>>");
            String order=sc.next();
            if(order.equals("그만")) {
                System.exit(1);
            }
            else {
                while(it.hasNext()) {
                    String key=it.next();
                    if(order.equals(key)) {
                        System.out.println(order+"는 "+menu.get(key)+"원 입니다.");
                    }
                }

            }
        }


    }

}

4번

한 어린이의 키를 2000년부터 2009년 사이에 1년 단위로 입력받아 벡터에 저장하라. 그리고 가장 키가 많이 자란 연도를 출력하라.


import java.util.*;
public class four {

    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        Vector<Float>height=new Vector<Float>();
        System.out.println("2000~2009년까지 1년 단위로 키 입력>>");

        for(int i=0;i<10;i++) {
            height.add(sc.nextFloat());
        }
        float max_growth=-1000000000;
        int max_idx=-1;
        for(int i=0;i<9;i++) {
            float growth=height.get(i+1)-height.get(i);
            if(growth>max_growth) {
                max_growth=growth;
                max_idx=i;
            }
        }
        System.out.println("가장 많이 키가 자란 년도는 200"+max_idx+"년 "+max_growth+"cm");

    }

}

5번

5개 나라 이름과 인구를 입력받아 해시맵에 저장하고, 가장 인구가 많은 나라를 검색하여 출력하는 프로그램을 작성하라. 이때 다음 해시맵을 이용하라.

import java.util.*;

public class five {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        HashMap<String,Integer> hashmap=new HashMap<String,Integer>();

        System.out.println("나라 이름과 인구를 5개 입력하세요.");
        for(int i=0;i<5;i++) {
            System.out.print("나라 이름, 인구 >>");
            hashmap.put(sc.next(),sc.nextInt()); //HashMap은 add가 아니라 put
        }

        Set<String>keys=hashmap.keySet();
        Iterator<String>it=keys.iterator();

        String max_nation=null;
        int ppl_max_cnt=-100000000;
        while(it.hasNext()){
            String key=it.next();
            if(hashmap.get(key)>ppl_max_cnt) {
                max_nation=key;
                ppl_max_cnt=hashmap.get(key);
            }
        }
        System.out.println("제일 인구가 많은 나라는 ("+max_nation+", "+ppl_max_cnt+")");
    }

}

6번

고객의 이름과 포인트 점수를 관리하는 프로그램을 해시맵을 이용하여 작성하라. 이 프로그램은 고객의 이름과 포인트를 누적하여 관리한다. 한 고객의 입력이 끝나면 현재까지의 모든 고객의 포인트 점수를 출력한다.

import java.util.*;

public class six {

    public static void main(String[] args) {

        System.out.println("** 포인트 관리 프로그램입니다. **");
        HashMap<String,Integer>info=new HashMap<String,Integer>();
        Scanner sc=new Scanner(System.in);

        while(true) {
            System.out.print("이름과 포인트 입력>>");
            String name=sc.next();
            /*name받고 연이어서 point받으면 안됨
             이유 : name에 exit들어오면 프로그램 종료 되어야 함
             1. name 입력 받음
                 1-1. exit임 -> 프로그램 종료
                 1-2. 이름임 -> 포인트 입력받음
                     2.포인트 관리 시작
                         2-1. 원래 있던 이름임
                         2-2. 새롭게 추가된 이름임
                     3. 목록 출력*/

            if(name.equals("exit")) { //1.1의 경우
                System.out.println("프로그램을 종료합니다....");
                System.exit(1);
            }

            else {//1.2의 경우
                int point=sc.nextInt(); //포인트 입력 받음

                //2. 포인트 관리 시작
                if(info.containsKey(name)) { //2.1의 경우
                    /*constainKey(key) : 해당 키 값 있으면 true 반환
                         입력 받은 name이 이미 HashMap에 있음
                         ->get()으로 받은 value에 이번에 새로운 point 추가해서 put*/
                        info.put(name, info.get(name)+point);
                }
                else {//2.2의 경우
                    info.put(name, point);//새로운 name과 point 쌍 추가
                }

                //3. 목록 출력
                Set<String>keys=info.keySet(); //key 집합
                Iterator<String>it=keys.iterator(); //iterator 생성
                while(it.hasNext()) {
                    String key=it.next();//key값 순차적으로 받음
                    int value=info.get(key); //받은 key값으로 value 값 받기
                    System.out.print("("+key+","+value+")"); //출력
                    }
                System.out.println();
                /*목록 다 출력했으면 줄바꿈입력 -> 다음 줄부터 다시 이름과 포인트 입력 받기*/
            }

        }

    }

}

7번

Location 클래스는 2차원 평면에서 하나의 위치(x, y)를 표현한다. Location 객체로 쥐가 이동한 각 위치를 저장하고 이들로부터 총 이동 거리를 구하고자 한다. ArrayList 컬렉션에 쥐의 위치(Location 객체)를 5개 입력받아 삽입한 후 총 길이를 구하여라. 시작 위치는 (0, 0)이며, (0, 0) 위치로 돌아온다.

package java_7;
/*Location 클래스는 2차원 평면에서 하나의 위치(x, y)를 표현한다.
 * Location 객체로 쥐가 이동한 각 위치를 저장하고 이들로부터 총 이동 거리를 구하고자 한다. 
 * ArrayList 컬렉션에 쥐의 위치(Location 객체)를 5개 입력받아 삽입한 후 총 길이를 구하여라. 
 * 시작 위치는 (0, 0)이며, (0, 0) 위치로 돌아온다.*/

import java.util.*;
import java.lang.Math;

class Location{
    private int x,y; /*외부 클래스 안에 변수에 대해서 private 처리*/
    public Location(int x, int y) {
        this.x=x;
        this.y=y;
    }
    public int getX() {
        return x;/*return this.x 말고 return x*/
    }
    public int getY() {
        return y;
    }
}

public class seven {

    public static void main(String[] args) {
    ArrayList<Location>Loc=new ArrayList<Location>();
    Scanner sc=new Scanner(System.in);

    System.out.println("쥐가 이동한 위치(x,y)를 5개 입력하여라");

    Loc.add(new Location(0,0));//시작점 (0,0)
    for(int i=0;i<5;i++) {
        Loc.add(new Location(sc.nextInt(),sc.nextInt())); // 경로 좌표 5개
        }
    Loc.add(new Location(0,0));//반환점 (0,0)

    double dis_total=0;
    for(int i=0;i<Loc.size()-1;i++) {//iteration 범위 주의
        /*(int i=1;i<Loc.size();i++)로 하고
        Loc.get(i-1)과 Loc.get(i)로 불러와도 됨 */
        Location first=Loc.get(i); 
        Location second=Loc.get(i+1);

        double dis_x=Math.pow(-first.getX()+second.getX(),2);
        double dis_y=Math.pow(-first.getY()+second.getY(),2);

        dis_total+=Math.sqrt(dis_x+dis_y);

    }
    System.out.println("총 이동거리는 "+dis_total);
    sc.close(); //잊지 말자 scanner close()
    }

}

bonus_1

아래의 HV 클래스는 해시맵을 인자로 받아 벡터를 리턴하는 hashToVector() 메소드를 가지고 있다. hashToVector()는 해시맵 내의 ‘값(value)’을 모두 Vector에 삽입하여 리턴한다. 빈칸을 완성하라.


import java.util.*;

public class HV {

    public static Vector<String> hashToVector(HashMap<String,String> h){
        Vector<String>v=new Vector<String>();//백터 생성
        Set<String>s=h.keySet();//해시맵 h로부터 키 set 컬랙션 s 얻기
        Iterator<String> it=s.iterator();
        while(it.hasNext()) {
            String key=it.next();
            v.add(h.get(key));//'값'을 벡터에 삽입
        }
        return v;//return 문
    }

    public static void main(String[] args) {
        HashMap<String,String> h=new HashMap<String,String>();                 //해시맵 h 생성
        h.put("범죄", "112");
        h.put("화재", "119");
        h.put("전화번호","114");
        Vector<String>v=hashToVector(h); //hashToVector() 호출
        for(int n=0;n<v.size();n++) {
             //v의 모든 요소에 대해 반복                       
            System.out.print(v.get(n)+" ");
        }
    }

}
Comments