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

히치키치·2021년 6월 6일
1

요약

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

}

0개의 댓글