관리 메뉴

거니의 velog

230828_컬렉션 프레임워크 5 본문

대덕인재개발원_자바기반 애플리케이션

230828_컬렉션 프레임워크 5

Unlimited00 2023. 8. 28. 15:05

[PhoneBookTest2.java]

package kr.or.ddit.basic;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

/*
 * 문제) 이름, 주소, 전화번호를 멤버로 갖는 Phone 클래스를 만들고,
 * 		Map을 이용하여 전화번호 정보를 관리하는 프로그램을 작성하시오.
 * 
 * 		(Map의 구조는 Key값으로 입력한 '이름'을 사용하고, value값으로는 'Phone클래스의 인스턴스'로 한다.)
 * 		변수 선언 예시) HashMap<String, Phone> 변수명;
 * 
 * 		이 프로그램에는 다음과 같은 메뉴가 있는데 각 메뉴의 기능을 구현한다.
 * 		-----------------
 * 		다음 메뉴를 선택하세요.
 * 		1. 전화번호 등록
 * 		2. 전화번호 수정
 * 		3. 전화번호 삭제
 * 		4. 전화번호 검색
 * 		5. 전화번호 전체 출력
 * 		0. 프로그램 종료
 * 		-----------------
 * 
 * 		- 검색, 삭제 기능은 '이름'을 입력 받아 처리한다.
 * 
 * 실행 예시)
 * 		-----------------
 * 		다음 메뉴를 선택하세요.
 * 		1. 전화번호 등록
 * 		2. 전화번호 수정
 * 		3. 전화번호 삭제
 * 		4. 전화번호 검색
 * 		5. 전화번호 전체 출력
 * 		0. 프로그램 종료
 * 		-----------------
 * 		메뉴선택 >> 1
 * 
 * 		새롭게 등록할 전화번호 정보를 입력하세요.
 * 		이     름 >> 홍길동
 * 		전화번호 >> 010-1234-5678
 * 		주     소 >> 대전시 중구 오류동
 * 
 * 		'홍길동' 전화번호 등록 완료!!!
 * 		
 * 		-----------------
 * 		다음 메뉴를 선택하세요.
 * 		1. 전화번호 등록
 * 		2. 전화번호 수정
 * 		3. 전화번호 삭제
 * 		4. 전화번호 검색
 * 		5. 전화번호 전체 출력
 * 		0. 프로그램 종료
 * 		-----------------
 * 		메뉴선택 >> 1
 * 
 * 		새롭게 등록할 전화번호 정보를 입력하세요.
 * 		이     름 >> 홍길동
 * 		
 * 		'홍길동'은 이미 등록된 사람입니다...
 * 
 * 		-----------------
 * 		다음 메뉴를 선택하세요.
 * 		1. 전화번호 등록
 * 		2. 전화번호 수정
 * 		3. 전화번호 삭제
 * 		4. 전화번호 검색
 * 		5. 전화번호 전체 출력
 * 		0. 프로그램 종료
 * 		-----------------
 * 		메뉴선택 >> 5
 * 
 * 		----------------------------------------
 * 		번호      이름       전화번호               주소
 * 		----------------------------------------
 * 		1          홍길동    010-1234-5678  대전시 중구 오류동
 * 		~~~
 * 		~~~
 * 		----------------------------------------
 * 		출력 끝...
 * 
 * 		-----------------
 * 		다음 메뉴를 선택하세요.
 * 		1. 전화번호 등록
 * 		2. 전화번호 수정
 * 		3. 전화번호 삭제
 * 		4. 전화번호 검색
 * 		5. 전화번호 전체 출력
 * 		0. 프로그램 종료
 * 		-----------------
 * 		메뉴선택 >> 0
 * 
 * 		프로그램을 종료합니다.
 * 
 */
public class PhoneBookTest2 {
	
	private HashMap<String, Phone2> phoneBookMap;
	private Scanner sc;
	
	// 생성자
	public PhoneBookTest2() {
		phoneBookMap = new HashMap<String, Phone2>();
		sc = new Scanner(System.in);
	}
	
	public static void main(String[] args) {
		
		new PhoneBookTest2().startPhoneBook();
		
	}
	
	// 프로그램을 시작하는 메서드
	public void startPhoneBook() {
		System.out.println("************************");
		System.out.println(" 전 화 번 호 관 리 프 로 그 램");
		System.out.println("************************");
		while(true) {
			int choice = displayMenu();
			
			switch(choice) {
			case 1: // 전화번호 등록
				insert(); break;
			case 2: // 전화번호 수정
				update(); break;
			case 3: // 전화번호 삭제
				delete(); break;
			case 4: // 전화번호 검색
				search(); break;
			case 5: // 전화번호 전체 출력
				displayAll(); break;
			case 0: // 프로그램 종료
				System.out.println("프로그램을 종료합니다.");
				return;
			default: 
				System.out.println("작업 번호를 잘못 입력했습니다.");
				System.out.println("다시 선택하세요...");
			}
		}
	}
	
	// 메뉴를 출력하고 작업 번호를 입력받아 반환하는 메서드
	private int displayMenu() {
		System.out.println();
		System.out.println("-----------------");
		System.out.println("다음 메뉴를 선택하세요.");
		System.out.println("1. 전화번호 등록");
		System.out.println("2. 전화번호 수정");
		System.out.println("3. 전화번호 삭제");
		System.out.println("4. 전화번호 검색");
		System.out.println("5. 전화번호 전체 출력");
		System.out.println("0. 프로그램 종료");
		System.out.println("-----------------");
		System.out.print("메뉴선택 >> ");
		return sc.nextInt();
	}
	
	// 새로운 전화번호 정보를 등록하는 메서드 (이미 등록된 사람은 등록되지 않는다.)
	private void insert() {
		System.out.println();
		System.out.println("새로운 전화번호 정보를 입력하세요...");
		
		System.out.print("이 름 >> ");
		String name = sc.next();
		
		// 입력받은 이름이 이미 등록된 이름인지 검사
		if(phoneBookMap.containsKey(name)) {
			System.out.println(name + "씨는 이미 등록된 사람입니다...");
			System.out.println("등록 작업을 마칩니다.");
			return;
		}
		
		System.out.print("전화번호 >> ");
		String tel = sc.next();
		
		sc.nextLine(); // 일종의 입력 버퍼 비우기
		System.out.print("주 소 >> ");
		// String addr = sc.next(); // '대전시 중구 오류동' 중에 대전시만 가져가고 [데이터구분자 : 사이띄기, tab키, enter키], '중구 오류동' 중에 중구를 가져다 displayMenu()의 return sc.nextInt();와 충돌을 일으켜 오류가 뜸.
		String addr = sc.nextLine(); // 처음 문장부터 enter키 이전까지 모두 가져옴. enter 키를 제외한 값을 반환함.
		// String tel = sc.next(); 에 010-1234-1234[엔터키] 중에 010-1234-1234만 가져가고 구분자 [엔터키]를 남김. 
		// 이 구분자 [엔터키]를 String addr = sc.nextLine();이 인식해서 값을 입력받지 않고 그냥 넘어가 버림.
		// 따라서 실제 주소를 입력받기 전에 이 찌꺼기(구분자 [엔터키])를 비워줘야 함.
		// sc.nextLine(); 입력키를 한 번더 입력해 주면 끝.
		
		/*
		 * - Scanner객체는 입력 버퍼를 이용하여 입력 작업을 수행한다.
		 * 		즉, 입력 버퍼를 확인하여 값이 있으면 현재 입력 버퍼에 있는 값을 가져가고
		 * 		없으면 새로운 데이터를 입력받은 후 가져간다.
		 * 
		 * - Scanner의 next(), nextInt(), nextDouble() ... 등 (nextLine()을 제외한 메서드)
		 * 		==> 이 메서드들은 사이띄기, Tab키, Enter키를 구분 문자로 분리해서 분리된 자료만 읽어간다.
		 * 
		 * - Scanner의 nextLine()메서드
		 * 		==> 한 줄 단위로 입력한다. (즉, 자료를 입력하고 Enter키를 누르면 Enter키까지 읽어간다.)
		 */
		
		// 입력 받은 정보를 이용하여 Phone2 객체 생성
//		Phone2 p = new Phone2(name, tel, addr);
//		phoneBookMap.put(name, p);
		
		phoneBookMap.put(name, new Phone2(name, tel, addr));
		
		System.out.println(name + "씨의 전화번호 정보 등록 완료!!!");
	}
	
	// 전체 전화번호 정보를 출력하는 메서드
	private void displayAll() {
		System.out.println();
		System.out.println("----------------------------------------");
		System.out.println("번호      이름       전화번호               주소");
		System.out.println("----------------------------------------");
		
		Set<String> phoneBookSet = phoneBookMap.keySet();
		if(phoneBookSet.size() == 0) {
			System.out.println("등록된 전화번호 정보가 하나도 없습니다...");
		}else {
			int cnt = 0; // 번호 출력용 변수
			
			Iterator<String> it = phoneBookSet.iterator();
			while(it.hasNext()) {
				cnt++;
				String key = it.next(); // 키 값(등록된 사람 이름)
				Phone2 p = phoneBookMap.get(key); // Value값(Phone2 객체)
				
				System.out.println(" " + cnt + "\t" + p.getName() + "\t" + p.getTel() + "\t" + p.getAddr());
			}
		}
		
		System.out.println("----------------------------------------");
		System.out.println("출력 끝...");
	}
	
	// 전화번호를 수정하는 메서드
	private void update() {
		System.out.println();
		System.out.println("수정할 전화번호 정보를 입력하세요...");
		System.out.print("이 름 >> ");
		String name = sc.next();
		
		// 해당 이름이 없으면 수정 작업을 중단한다.
		if(!phoneBookMap.containsKey(name)) {
			System.out.println(name + "씨의 전화번호 정보는 등록되지 않았습니다.");
			System.out.println("수정 작업을 마칩니다...");
			return;
		}
		
		System.out.print("새로운 전화번호 >> ");
		String newTel = sc.next();
		
		sc.nextLine(); // 일종의 입력 버퍼 비우기
		System.out.print("새로운 주소 >> ");
		// String newAddr = sc.next();
		String newAddr = sc.nextLine();
		
		// 같은 key값에 새로운 데이터를 셋팅한 Phone2 객체를 저장하면 된다.
		phoneBookMap.put(name, new Phone2(name, newTel, newAddr));
		
		System.out.println(name + "씨의 전화번호 정보 수정 완료!!!");
	}
	
	// 전화번호 정보를 삭제하는 메서드
	private void delete() {
		System.out.println();
		System.out.println("삭제할 전화번호 정보를 입력하세요.");
		System.out.print("이 름 >> ");
		String name = sc.next();
		
		// 해당 이름이 없으면 삭제 작업을 중단한다.
		if(!phoneBookMap.containsKey(name)) {
			System.out.println(name + "씨의 전화번호 정보는 등록되지 않았습니다.");
			System.out.println("삭제 작업을 마칩니다...");
			return;
		}
		
		phoneBookMap.remove(name); // 삭제작업
		
		System.out.println(name + "씨의 전화번호 정보를 삭제했습니다...");
	}
	
	// 전화번호 정보를 검색하는 메서드
	private void search() {
		System.out.println();
		System.out.println("검색할 전화번호 정보를 입력하세요...");
		System.out.print("이 름 >> ");
		String name = sc.next();
		
		// 입력한 이름을 key값으로 Phone2 객체 가져오기
		Phone2 p = phoneBookMap.get(name);
		
		if(p==null) { // 해당 key값의 데이터가 없으면...
			System.out.println(name + "씨의 전화번호 정보가 없습니다...");
		}else {
			System.out.println();
			System.out.println(name + "씨의 전화번호 정보");
			System.out.println("-----------------------");
			System.out.println("이     름 : " + p.getName());
			System.out.println("전화번호 : " + p.getTel());
			System.out.println("주     소 : " + p.getAddr());
			System.out.println("-----------------------");
		}
	}
	
}

// 이름, 주소, 전화번호를 멤버로 갖는 Phone 클래스를 만들기
class Phone2 {
	
	private String name;
	private String tel;
	private String addr;
	
	public Phone2() {}
	public Phone2(String name, String tel, String addr) {
		this.name = name;
		this.tel = tel;
		this.addr = addr;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getTel() {
		return tel;
	}
	
	public void setTel(String tel) {
		this.tel = tel;
	}
	
	public String getAddr() {
		return addr;
	}
	
	public void setAddr(String addr) {
		this.addr = addr;
	}
	
	@Override
	public String toString() {
		return "Phone2 [name=" + name + ", tel=" + tel + ", addr=" + addr + "]";
	}
	
}


[LottoTest2.java]

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;

/*로또를 구매하는 프로그램 작성하기

사용자는 로또를 구매할 때 구매할 금액을 입력하고
입력한 금액에 맞게 로또번호를 출력한다.
(단, 로또 한장의 금액은 1000원이며 최대 100장까지만 구입할 수 있고,
     거스름돈도 계산하여 출력한다.)

	==========================
        	Lotto 프로그램
	--------------------------
	 1. Lotto 구입
	 2. 프로그램 종료
	==========================		 
	메뉴선택 : 1  <-- 입력
			
	 Lotto 구입 시작
		 
	(1000원에 로또번호 하나입니다.)
	금액 입력 : 2500  <-- 입력
			
	행운의 로또번호는 아래와 같습니다.
	로또번호1 : 2,3,4,5,6,7
	로또번호2 : 20,21,22,23,24,25
			
	받은 금액은 2500원이고 거스름돈은 500원입니다.

	==========================
        	Lotto 프로그램
	--------------------------
	 1. Lotto 구입
	 2. 프로그램 종료
	==========================		 
	메뉴선택 : 1  <-- 입력
			
	 Lotto 구입 시작
		 
	(1000원에 로또번호 하나입니다.)
	금액 입력 : 900  <-- 입력
	
	입력 금액이 너무 적습니다. 로또번호 구입 실패!!!

	==========================
        	Lotto 프로그램
	--------------------------
	 1. Lotto 구입
	 2. 프로그램 종료
	==========================		 
	메뉴선택 : 1  <-- 입력
			
	 Lotto 구입 시작
		 
	(1000원에 로또번호 하나입니다.)
	금액 입력 : 101000  <-- 입력
	
	입력 금액이 너무 많습니다. 로또번호 구입 실패!!!
			
  	==========================
           Lotto 프로그램
	--------------------------
	  1. Lotto 구입
	  2. 프로그램 종료
	==========================		 
	메뉴선택 : 2  <-- 입력
		
	감사합니다*/

public class LottoTest2 {

	private Scanner sc = new Scanner(System.in);
	
	public static void main(String[] args) {
		new LottoTest2().startLottoStore();
	}
	
	// 시작 메서드
	public void startLottoStore() {
		while(true) {
			int choice = displayMenu();
			
			switch(choice) {
				case 1: // 구입
					buyLotto(); break;
				case 2:
					System.out.println();
					System.out.println("감사합니다...");
					return;
				default:
					System.out.println("작업 번호를 잘못 입력하셨습니다...");
					System.out.println("작업 번호는 '1' 또는 '2'를 입력하세요...");
			}
		}
	}
	
	// 메뉴 출력 및 작업번호를 입력 받아 반환하는 메서드
	private int displayMenu() {
		System.out.println("==========================");
		System.out.println("       Lotto 프로그램");
		System.out.println("--------------------------");
		System.out.println("  1. Lotto 구입");
		System.out.println("  2. 프로그램 종료");
		System.out.println("==========================");
		System.out.print("메뉴 선택 >> ");
		return sc.nextInt();
	}
	
	// 로또 구입을 처리하는 메서드
	private void buyLotto() {
		System.out.println();
		System.out.println(" Lotto 구입 시작");
		System.out.println();
		System.out.println("(1000원에 로또번호 하나입니다.)");
		System.out.print("금액 입력 >> ");
		int money = sc.nextInt();
		
		System.out.println();
		if(money < 1000) { // 입력 금액이 1000원 미만 여부 검사
			System.out.println("입력 금액이 너무 적습니다. 로또번호 구입 실패!!!");
			return;
		}
		if(money >= 101000) { // 입력 금액이 101000원 이상 여부 검사
			System.out.println("입력 금액이 너무 많습니다. 로또번호 구입 실패!!!");
			return;
		}
		
		//--------------------------------------
		// 금액에 맞는 로또 번호 만들기
		
		HashSet<Integer> lottoSet = new HashSet<Integer>();
		
		// 입력한 금액을 이용하여 구입할 로또의 매수를 구한다.
		int ticket = money / 1000;
		
		System.out.println("행운의 로또번호는 아래와 같습니다.");
		for(int i=1; i<=ticket; i++) { // 로또의 매수만큼 반복
			
			// 1장 분의 로또번호를 만든다. (1~45 사이의 중복되지 않는 번호 6개 만들기)
			while(lottoSet.size() < 6) {
				lottoSet.add((int)(Math.random() * 45 + 1));
			}
			
			// Set에 저장된 로또번호를 갖는 List 객체 생성
			ArrayList<Integer> lottoList = new ArrayList<Integer>(lottoSet);
			
			Collections.sort(lottoList);
			
			System.out.println("로또번호 " + i + " : " + lottoList);
			
			// 작업에 사용한 Set 객체를 비워준다.
			lottoSet.clear();
			
		} // for문 끝...
		
		// 거스름돈 계산 및 출력
		// 받은 금액은 2500원이고 거스름돈은 500원입니다.
		System.out.println();
		System.out.println("받은 금액은 "+ money +"원이고 거스름돈은 "+ (money % 1000) +"원입니다.");
		System.out.println();
		
	}

}


[HotelRoomManagement.java]

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

/*문제) 호텔 객실을 관리하는 프로그램을 작성하시오.

조건1)  호텔 객식을 나타내는 Room클래스는 방번호(int), 방종류, 투숙객이름 필드로 구성되어 있고			     
        방번호와 방종류는 다음과 같다.
        - 201~209 : 싱글룸
        - 301~309 : 더블룸
        - 401~409 : 스위트룸

조건2) 전체 객실 관리는 Map을 이용한다.
       (Map의 key값은 방번호로 하고 value값은 Room의 인스턴스로 한다.)
       생성자에서는 방번호와 방종류를 초기화한다.




실행예시)

*********************************************
    호텔문을 열었습니다. 어서오십시요.
*********************************************


-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>>	1     <--- 입력

----------------------------------------------
체크인 작업
----------------------------------------------
* 201~209 : 싱글룸
* 301~309 : 더블룸
* 401~409 : 스위트룸
----------------------------------------------
방 번호 입력 >> 101     <--- 입력
101호 객실은 존재하지 않습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>>	1     <--- 입력

----------------------------------------------
체크인 작업
----------------------------------------------
* 201~209 : 싱글룸
* 301~309 : 더블룸
* 401~409 : 스위트룸
----------------------------------------------
방 번호 입력 >> 201     <--- 입력
누구를 체크인 하시겠습니까?
이름 입력 >> 홍길동
체크인이 완료되었습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>>	1     <--- 입력

----------------------------------------------
체크인 작업
----------------------------------------------
* 201~209 : 싱글룸
* 301~309 : 더블룸
* 401~409 : 스위트룸
----------------------------------------------
방 번호 입력 >> 201     <--- 입력
201호 객실은 이미 손님이 있습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>>	3     <--- 입력

----------------------------------------------
		현재 객실 상태
----------------------------------------------
방 번호	 방 종류	 투숙객 이름
----------------------------------------------
201	 싱글룸 	홍길동	
202	 싱글룸 	  -	
203	 싱글룸 	  -	
204	 싱글룸 	  -	
205	 싱글룸 	  -	
206	 싱글룸 	  -	
207	 싱글룸 	  -	
208	 싱글룸 	  -	
209	 싱글룸 	  -	
301	 더블룸 	  -	
302	 더블룸 	  -	
303	 더블룸 	  -	
304	 더블룸 	  -	
305	 더블룸 	  -	
306	 더블룸 	  -	
307	 더블룸 	  -	
308	 더블룸 	  -	
309	 더블룸 	  -	
401	스위트룸	  -	
402	스위트룸	  -	
403	스위트룸	  -	
404	스위트룸	  -	
405	스위트룸	  -	
406	스위트룸	  -	
407	스위트룸	  -	
408	스위트룸	  -	
409	스위트룸	  -	
----------------------------------------------

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>>	2    <--- 입력

----------------------------------------------
체크아웃 작업
----------------------------------------------
체크아웃 할 방 번호를 입력하세요.
방번호 입력 >> 101    <--- 입력
101호 객실은 존재하지 않습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>>	2    <--- 입력

----------------------------------------------
체크아웃 작업
----------------------------------------------
체크아웃 할 방 번호를 입력하세요.
방번호 입력 >> 303    <--- 입력
303호 객실에는 체크인 한 사람이 없습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>>	2    <--- 입력

----------------------------------------------
체크아웃 작업
----------------------------------------------
체크아웃 할 방 번호를 입력하세요.
방번호 입력 >> 201    <--- 입력
201호 객실의 홍길동님 체크아웃을 완료하였습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>>	3    <--- 입력


----------------------------------------------
		현재 객실 상태
----------------------------------------------
방 번호	 방 종류	 투숙객 이름
----------------------------------------------
201	 싱글룸 	  -	
202	 싱글룸 	  -	
203	 싱글룸 	  -	
204	 싱글룸 	  -	
205	 싱글룸 	  -	
206	 싱글룸 	  -	
207	 싱글룸 	  -	
208	 싱글룸 	  -	
209	 싱글룸 	  -	
301	 더블룸 	  -	
302	 더블룸 	  -	
303	 더블룸 	  -	
304	 더블룸 	  -	
305	 더블룸 	  -	
306	 더블룸 	  -	
307	 더블룸 	  -	
308	 더블룸 	  -	
309	 더블룸 	  -	
401	스위트룸	  -	
402	스위트룸	  -	
403	스위트룸	  -	
404	스위트룸	  -	
405	스위트룸	  -	
406	스위트룸	  -	
407	스위트룸	  -	
408	스위트룸	  -	
409	스위트룸	  -	
----------------------------------------------


-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>>	4    <--- 입력

*********************************************
    호텔문을 닫았습니다.
**********************************************/

public class HotelRoomManagement {

	private HashMap<Integer, Room> roomMap;
	private Scanner sc;
	
	public HotelRoomManagement() {
		roomMap = new HashMap<Integer, Room>();
		sc = new Scanner(System.in);
		for(int i=200; i<500; i+=100) {
			for(int j=1; j<10; j++) {
				switch(i/100) {
					case 2:
						roomMap.put(i+j, new Room(i+j, "싱글룸", "-"));
						break;
					case 3:
						roomMap.put(i+j, new Room(i+j, "더블룸", "-"));
						break;
					case 4:
						roomMap.put(i+j, new Room(i+j, "스위트룸", "-"));
						break;
				}
			}
		}
	}

	public static void main(String[] args) {
		
		new HotelRoomManagement().roomStart();
		
	}
	
	public void roomStart() {
		System.out.println();
		System.out.println("*********************************************");
		System.out.println("       호텔문을 열었습니다. 어서오십시요.");
		System.out.println("*********************************************");
		System.out.println();
		
		while(true) {
			int choice = task();
			switch(choice) {
				case 1:
					checkIn(); break;
				case 2:
					checkOut(); break;
				case 3:
					roomCondition(); break;
				case 4:
					System.out.println();
					System.out.println("*********************************************");
					System.out.println("       호텔문을 닫았습니다.");
					System.out.println("*********************************************");
					return;
				default:
					System.out.println("작업 번호를 잘못 입력했습니다.");
					System.out.println("다시 선택하세요.");
			}
		}
	}
	
	public int task() {
		System.out.println();
		System.out.println("-----------------------------------------------------------");
		System.out.println("어떤 업무를 하시겠습니까?");
		System.out.println("1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료");
		System.out.println("-----------------------------------------------------------");
		System.out.print("선택 >> ");
		
		return sc.nextInt();
	}
	
	private void checkIn() {
		System.out.println("----------------------------------------------");
		System.out.println("   체크인 작업");
		System.out.println("----------------------------------------------");
		System.out.println(" * 201~209 : 싱글룸");
		System.out.println(" * 301~309 : 더블룸");
		System.out.println(" * 401~409 : 스위트룸");
		System.out.println("----------------------------------------------");
		System.out.print("방 번호 입력 >> ");
		int roomNum = sc.nextInt();
		
		// 방 번호가 없을 때
		if(!roomMap.containsKey(roomNum)) {
			System.out.println(roomNum + "호 객실은 존재하지 않습니다.");
			return;
		}
		
		// 방에 사람이 있을 때
		if(!roomMap.get(roomNum).getGuest().equals("-")) {
			System.out.println(roomNum + "호 객실은 이미 손님이 있습니다.");
			return;
		}
		
		System.out.println("누구를 체크인 하시겠습니까?");
		System.out.print("이름 입력 >> ");
		String guest = sc.next();
		roomMap.get(roomNum).setGuest(guest);
		System.out.println("체크인이 완료되었습니다.");
	}
	
	private void checkOut() {
		System.out.println("----------------------------------------------");
		System.out.println("   체크아웃 작업");
		System.out.println("----------------------------------------------");
		System.out.println("체크아웃 할 방 번호를 입력하세요.");
		System.out.print("방번호 입력 >> ");
		int roomNum = sc.nextInt();
		
		// 방 번호가 없을 때
		if(!roomMap.containsKey(roomNum)) {
			System.out.println(roomNum + "호 객실은 존재하지 않습니다.");
			return;
		}
		
		// 체크인 한 사람이 없을 때
		if(roomMap.get(roomNum).getGuest().equals("-")) {
			System.out.println(roomNum + "호 객실은 체크인한 사람이 없습니다.");
			return;
		}
		
		System.out.println(roomNum + "호 객실의 " + roomMap.get(roomNum).getGuest() + "님을 체크아웃을 완료하였습니다.");
		roomMap.get(roomNum).setGuest("-");
	}
	
	private void roomCondition() {
		System.out.println("----------------------------------------------");
		System.out.println("		현재 객실 상태");
		System.out.println("----------------------------------------------");
		System.out.println("방 번호	 방 종류	 투숙객 이름");
		System.out.println("----------------------------------------------");
		List<Room> list = new ArrayList<Room>();
		for(Integer key : roomMap.keySet()) {
			// 맵에 있는 키 값을 가져와서 set으로 반환해서 키에 넣기
			Room value = roomMap.get(key);
			list.add(value);
		}
		Collections.sort(list);
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i).getRoomNum() + "\t" + list.get(i).getRoomType() + "\t" + list.get(i).getGuest());
		}
		System.out.println("----------------------------------------------");
	}

}

class Room implements Comparable<Room>{
	
	private int roomNum;
	private String roomType;
	private String guest;
	
	public Room() {}
	public Room(int roomNum, String roomType, String guest) {
		super();
		this.roomNum = roomNum;
		this.roomType = roomType;
		this.guest = guest;
	}
	
	public int getRoomNum() {
		return roomNum;
	}
	
	public void setRoomNum(int roomNum) {
		this.roomNum = roomNum;
	}
	
	public String getRoomType() {
		return roomType;
	}
	
	public void setRoomType(String roomType) {
		this.roomType = roomType;
	}
	
	public String getGuest() {
		return guest;
	}
	
	public void setGuest(String guest) {
		this.guest = guest;
	}
	
	@Override
	public String toString() {
		return roomNum + "\t" + roomType + "\t" + guest;
	}
	
	@Override
	public int compareTo(Room o) {
		return Integer.compare(this.getRoomNum(), o.getRoomNum());
	}
	
}