관리 메뉴

거니의 velog

230825_컬렉션 프레임워크 4 본문

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

230825_컬렉션 프레임워크 4

Unlimited00 2023. 8. 25. 14:50

[BaseBallTest2.java]

package kr.or.ddit.basic;

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

/*
 * 문제 ) Set을 이용하여 숫자 야구 게임 프로그램을 작성하시오.
 * 		==> 컴퓨터의 숫자는 난수를 이용하여 구한다. (1 ~ 9 사이의 난수 3개)
 * 			(스트라이크는 S, 볼은 B로 나타낸다.)
 * 
 * 예시 ) 
 * 		컴퓨터의 난수 ==> 9 5 7
 * 		
 * 실행예시 )
 * 		숫자입력 >> 3 5 6
 * 		3 5 6 ==> 1S 0B
 * 		숫자입력 >> 7 8 9
 * 		7 8 9 ==> 0S 2B
 * 		숫자입력 >> 9 7 5
 * 		9 7 5 ==> 1S 2B
 * 		숫자입력 >> 9 5 7
 * 		9 5 7 ==> 3S 0B
 * 		
 * 		축하합니다...
 * 		당신은 4번만에 정답을 맞췄습니다...
 */

public class BaseBallTest2 {
	
	private ArrayList<Integer> numList; // 난수가 저장될 리스트
	private ArrayList<Integer> userList; // 사용자가 입력한 값이 저장될 리스트
	
	private int strike, ball; // 스트라이크 개수와 볼의 개수가 저장될 변수
	
	private Scanner sc = new Scanner(System.in);
	
	// 1 ~ 9 사이의 서로 다른 난수 3개를 만들어서 리스트에 저장하는 메서드(Set 이용)
	public void createNum() {
		
		Set<Integer> numSet = new HashSet<Integer>();
		
		// 난수 3개 만들기
		while(numSet.size() < 3) {
			numSet.add((int)(Math.random() * 9 + 1));
		}
		
		// 만들어진 난수를 List에 저장한다.
		numList = new ArrayList<Integer>(numSet);
		
		// List의 데이터를 섞어준다.
		Collections.shuffle(numList);
		
	}
	
	// 사용자로부터 3개의 정수를 입력받아 리스트에 저장하는 메서드
	// (입력한 값들은 중복되지 않게 한다.)
	public void inputNum() {
		
		int n1, n2, n3; // 입력한 정수가 저장될 변수 선언
		
		do {
			// enter, space, tab키를 기준으로 버퍼가 걸리므로 구분자를 생성한다.
			System.out.print("숫자입력 >> ");
			n1 = sc.nextInt();
			n2 = sc.nextInt();
			n3 = sc.nextInt();
			
			if(n1==n2 || n1==n3 || n2==n3) {
				System.out.println("중복되는 숫자는 입력할 수 없습니다. 다시 입력하세요...");
			}
			
		}while(n1==n2 || n1==n3 || n2==n3);
		
		// 입력한 데이터를 List에 저장한다.
		userList = new ArrayList<Integer>();
		userList.add(n1);
		userList.add(n2);
		userList.add(n3);
		
	}
	
	// 스트라이크와 볼을 판정하고 결과를 출력하는 메서드
	public void ballCount() {
		
		strike = 0;
		ball = 0; // 스트라이크와 볼의 개수를 0으로 초기화한다.
		
		for(int i=0; i<numList.size(); i++) {
			for(int j=0; j<userList.size(); j++) {
				if(numList.get(i) == userList.get(j)) { // 값이 같은지 비교
					if(i == j) { // 위치가 같은지 비교
						strike++;
					}else {
						ball++;
					}
				}
			}
		}
		
		// 볼카운트 결과를 출력한다.
		// 9 5 7 ==> 3S 0B
		System.out.println(userList.get(0) + " " + userList.get(1) + " " + userList.get(2) + " ==> " + strike + "S " + ball + "B");
		
	}
	
	// 게임을 진행하는 메서드
	public void startGame() {
		
		// 난수를 만드는 메서드 호출
		createNum();
		
		// 만들어진 난수값 확인하기
		System.out.println("컴퓨터의 난수 : " + numList); // 테스트 코드 이므로 주석 처리할 것.
		
		int cnt = 0; // 몇 번만에 맞췄는지를 저장하는 변수
		
		do {
			cnt++;
			
			// 사용자 입력 메서드 호출
			inputNum();
			
			// 볼카운트를 계산하는 메서드 호출
			ballCount();
			
			
		}while(strike != 3); // 3스트라이크가 될 때까지 반복한다.
		
		System.out.println();
		System.out.println("축하합니다...");
		System.out.println("당신은 " + cnt + "번째 만에 맞췄습니다...");
		
	}

	public static void main(String[] args) {
		
		new BaseBallTest2().startGame();
		
	}

}


[EqualsHashCodeTest.java]

package kr.or.ddit.basic;

import java.util.HashSet;
import java.util.Objects;

public class EqualsHashCodeTest {

	public static void main(String[] args) {
		
		Person p1 = new Person();
		p1.setNum(1);
		p1.setName("홍길동");
		
		Person p2 = new Person();
//		p2.setNum(2);
//		p2.setName("일지매");
		p2.setNum(1);
		p2.setName("홍길동");
		
		Person p3 = p1;
		
		System.out.println(p1 == p2); // false
		System.out.println(p1 == p3); // true
		System.out.println();
		
		System.out.println(p1.equals(p2)); // false
		System.out.println(p1.equals(p3)); // true
		System.out.println();
		
		// JVM의 메모리 구조, 크게 3 영역
		// 1. Method Area : - 프로그램에서 사용되는 클래스의 정보가 저장됨.
		//                  - static 자원을 저장.
		// 2. Stack Area :  - 메소드 호출 시 스택 영역을 활용.
		// 3. Heap Area :   - 객체가 생성되는 영역.
		
		// .java => .class 파일로 변환됨. 클래스 로더가 이것을 읽어들임.
		// 읽어들인 클래스 정보(EqualsHashCodeTest)를 Method Area에 저장.
		// Method Area에 main(String[] args) 메서드 저장.
		// 클래스 실행 시 컴퓨터가 main()를 검사. 만약 main()가 있으면 이것을 실행.
		// Stack Area에  stack프레임이 잡힘(main()).
		// main()의 지역 변수(String[] args)가 stack프레임 안에 잡힘.
		// Person 객체 정보를 Method Area에서 찾음. 없으면 Person 클래스를 찾아다가 정보를 읽어서 Method Area에 저장.
		
		// 참조형 변수 p1이 main()의 stack프레임 안에 잡힘.
		// = new Person();은 Heap Area에 생성.
		// Heap Area의 new Person() 객체 안에 num, name, getter, setter... 등이 만들어짐.
		// Person() 기본 생성자 호출. 생성자가 없으면 컴파일러가 기본 생성자 생성. num = 0; name = null;로 초기화.
		// 참조형 변수 p1에 new Person() 객체를 생성한 주소(100번지라고 가정)가 저장됨.
		// p1. ==> p1 변수에 100번지 주소를 참조해서 Heap Area에 100번지 주소를 가리키는 Person() 객체를 찾아감.
		// 그 객체 안에 setNum() 메서드를 호출한다.
		// Stack Area에 새로운 setNum()용  stack 프레임이 잡힘.
		// setNum() stack 프레임 안에 int num이 잡힘.
		// setNum(1->인수라 부름); 인수 값 1이 stack 프레임 안에 int num에 들어감.
		// stack 프레임 안에는 항상 this가 있고, p1이 가리키는 영역의 주소값이 들어가 있다.
		// this는 어떤 객체를 호출 하면 모든 메서드 안에 다 있다.
		// setNum(int num); 은 결국 자기 자신의 주소를 참조하여 int num의 1의 값을 담는다.
		// setNum() 메서드가 종료되면 stack 프레임이 사라지고 제어가 다시 main() 프레임으로 돌아옴.
		// p1.setName()도 마찬가지 역할을 수행.
		
		// p2라는 변수를 main() stack 프레임에 생성.
		// Person() 객체를 새로 heap 영역에 만든다. 
		// p2에 생성한 주소(200번지라고 가정)가 저장된다.
		// 나머지 수행 순서는 같다.
		
		// p3 변수에 p1을 넣는다? p1에는 100번지가 있음. 따라서 p3도 100번지를 가리키게 됨.
		
		// p1(100번지) == p2(200번지) ? false
		// p1(100번지) == p3(100번지) ? true
		
		// equals() 메서드는 Object에서 구현됨.
		// 기본적으로 참조값을 가지고 비교하기 때문에 결과가 같다.
		
		// equals() 메서드를 재정의한 후...
		System.out.println(p1.equals(p2)); // true
		System.out.println(p1.equals(p3)); // true
		System.out.println();
		
		HashSet<Person> testSet = new HashSet<Person>();
		testSet.add(p1);
		testSet.add(p2);
		System.out.println("testSet : " + testSet); // testSet : [Person [num=1, name=홍길동], Person [num=1, name=홍길동]]
		System.out.println("set의 개수 : " + testSet.size()); // set의 개수 : 2
		System.out.println("p1 : " + p1.hashCode()); // p1 : 366712642
		System.out.println("p2 : " + p2.hashCode()); // p2 : 1829164700
		System.out.println("p3 : " + p3.hashCode()); // p3 : 366712642
		
		/*
		 * - equals() 메서드      ==> 두 객체의 내용이 같은지 비교하는 메서드 (동등성 비교)
		 * - hashCode() 메서드  ==> 두 객체가 같은 객체인지를 비교하는 메서드 (동일성 비교)
		 */
		
		// hashCode()를 재정의 한 이후...
		System.out.println("testSet : " + testSet); // testSet : [Person [num=1, name=홍길동]]
		System.out.println("set의 개수 : " + testSet.size()); // set의 개수 : 1
		System.out.println("p1 : " + p1.hashCode()); // p1 : 54151054
		System.out.println("p2 : " + p2.hashCode()); // p2 : 54151054
		System.out.println("p3 : " + p3.hashCode()); // p3 : 54151054
		
	}

}

// num 변수의 값과 name 변수의 값 두 가지 모두 같으면 true를 반환하도록 equals() 메서드를 재정의 해보자.
class Person {
	
	private int num;
	private String name;
	
	public Person() {}
	public Person(int num, String name) {
		this.num = num;
		this.name = name;
	}
	
	public int getNum() {
		return num;
	}
	
	public void setNum(int num) {
		this.num = num;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return "Person [num=" + num + ", name=" + name + "]";
	}
	
	// 최신 기준
//	@Override
//	public boolean equals(Object obj) {
//		
//		// 참조값(주소값)이 같은지 검사
//		if(this == obj) { // 참조값이 서로 같다면? 무조건 같은 것.
//			return true;
//		}
//		if(obj == null) { // 비교할 객체가 null이라면? 무조건 다른 것.
//			return false;
//		}
//		
//		// 참조타입이 같은지 검사
//		if(this.getClass() != obj.getClass()) { // 서로 다른 종류의 클래스이므로 같은 값이 될 수 없다.
//			return false;
//		}
//		
//		Person that = (Person)obj; // 매개변수의 값을 현재 객체 유형으로 형변환(다운캐스팅)한다.
//		
//		// 각 변수값들이 모두 같은지 검사.
//		return this.num == that.num && Objects.equals(this.name, that.name);
//		
//	}
//	
//	@Override
//	public int hashCode() {
//		return Objects.hash(num, name);
//	}
	
	// 알트 + 시프트 + s : 자동 완성으로 만든 경우
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + num;
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		
		Person other = (Person) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (num != other.num)
			return false;
		return true;
	}
	
}

[MapTest.java]

package kr.or.ddit.basic;

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

public class MapTest {

	public static void main(String[] args) {
		
		/*
		 * Map ==> Key값과 Value값을 한 쌍으로 관리하는 객체
		 * 	    - Key값은 중복을 허용하지 않고 순서(index)가 없다. (Set의 특징을 갖는다.)
		 * 		- value값은 중복을 허용한다.
		 */
		
		HashMap<String, String> map = new HashMap<String, String>();
		
		// 자료 추가 ==> put(key값, value값)
		map.put("name", "홍길동");
		map.put("addr", "대전");
		map.put("tel", "010-1234-5678");
		
		System.out.println("map에 저장된 데이터의 개수 : " + map.size()); // map에 저장된 데이터의 개수 : 3
		System.out.println("map => " + map.toString()); // map => {name=홍길동, tel=010-1234-5678, addr=대전}
		System.out.println();
		
		// 자료 수정 ==> 데이터를 추가할 때 key값이 같으면 나중에 추가한 값으로 덮어쓴다.
		map.put("addr", "서울");
		System.out.println("map => " + map); // map => {name=홍길동, tel=010-1234-5678, addr=서울}
		System.out.println();
		
		// 자료 삭제 ==> remove(key값) : key값이 같은 자료를 찾아 삭제한다.
		//			   반환값 => 삭제된 자료의 value값.
//		String removeTel = map.remove("tel");
//		System.out.println("map => " + map); // map => {name=홍길동, addr=서울}
//		System.out.println("삭제된 값 : " + removeTel); // 삭제된 값 : 010-1234-5678
//		System.out.println();
		
		// 자료 읽기 ==> get(key값) : key값과 같이 저장된 value값을 반환한다.
		System.out.println("이름 : " + map.get("name")); // 이름 : 홍길동
		System.out.println();
		
		// key값의 존재 여부 알아내기 => containsKey(key값)
		// 					   => 해당 key값이 있으면 true, 없으면 false.
		System.out.println("tel 키값의 존재 여부 : " + map.containsKey("tel")); // tel 키값의 존재 여부 : true
		System.out.println("age 키값의 존재 여부 : " + map.containsKey("age")); // age 키값의 존재 여부 : false
		System.out.println();
		
		// Map에 저장된 모든 데이터를 차례대로 가져와 처리하기
		
		// 1. keySet()메서드 이용하기
		// 	  keySet()메서드 ==> map의 모든 key값들을 읽어와 Set형으로 반환한다.
		Set<String> keySet = map.keySet();
		Iterator<String> it = keySet.iterator();
		while(it.hasNext()) {
			String key = it.next();
			String value = map.get(key);
			System.out.println(key + " : " + value);
		}
		System.out.println("----------------------------------");
		
//		name : 홍길동
//		tel : 010-1234-5678
//		addr : 서울
		
		// 2. keySet을 향상된 for문으로 처리하기
//		for(String key : keySet) {
		for(String key : map.keySet()) {
			String value = map.get(key);
			System.out.println(key + " => " + value);
		}
		System.out.println("----------------------------------");
		
//		name : 홍길동
//		tel : 010-1234-5678
//		addr : 서울
		
		// 3. value값만 읽어와 처리하기 ==> values()메서드 이용
		for(String value : map.values()) {
			System.out.println(value);
		}
		System.out.println("----------------------------------");
		
//		홍길동
//		010-1234-5678
//		서울
		
		// 주로 1, 2번을 많이 사용. 특별한 경우 3번을 쓴다.
		
	}

}


[PhoneBookTest.java]

package kr.or.ddit.basic;

import java.util.HashMap;
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 PhoneBookTest {
	
	String name;
	String tell;
	String add;
	
	Scanner sc = new Scanner(System.in);
	HashMap<String, Phone> phoneBookmap = new HashMap<String, Phone>();
	
	public void start() {
		PhoneBookTest pbt = new PhoneBookTest();
		
		while(true) {
			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("메뉴선택 >> ");
			
			int input = Integer.parseInt(pbt.sc.nextLine());
			switch(input) {
			case 1:
//				System.out.println("1번 선택");
				pbt.add();
				break;
			case 2:
//				System.out.println("2번 선택");
				pbt.update();
				break;
			case 3:
//				System.out.println("3번 선택");
				pbt.delete();
				break;
			case 4:
//				System.out.println("4번 선택");
				pbt.search();
				break;
			case 5:
//				System.out.println("5번 선택");
				pbt.listAll();
				break;
			case 0:
				System.out.println("프로그램을 종료합니다.");
				System.exit(0);
			default:
				System.out.println("다시 입력해주세요...");
			}
			
		}
	}
	
	public void add() {
		PhoneBookTest pbt = new PhoneBookTest();
		
		System.out.println("새롭게 등록할 전화번호 정보를 입력하세요.");
		System.out.print("이     름 >> ");
		pbt.name = pbt.sc.nextLine();
		if(phoneBookmap.get(pbt.name) != null) {
			System.out.println("'"+ pbt.name + "'님은 이미 등록된 사람입니다.");
			pbt.add();
		}
		System.out.print("전화번호 >> ");
		pbt.tell = pbt.sc.nextLine();
		System.out.print("주     소 >> ");
		pbt.add = pbt.sc.nextLine();
		phoneBookmap.put(pbt.name, new Phone(pbt.name, pbt.add, pbt.tell));
		System.out.println("'" + phoneBookmap.get(pbt.name).getName() + "' 전화번호 등록 완료!!!");

		System.out.println(phoneBookmap.get(pbt.name)); // 테스트 코드
	}
	
	public void update() {
		PhoneBookTest pbt = new PhoneBookTest();
		
		System.out.println("수정할 전화번호 정보를 입력하세요.");
		System.out.print("이     름 >> ");
		pbt.name = pbt.sc.nextLine();
		System.out.print("전화번호 >> ");
		pbt.tell = pbt.sc.nextLine();
		System.out.print("주     소 >> ");
		pbt.add = pbt.sc.nextLine();
		phoneBookmap.put(pbt.name, new Phone(pbt.name, pbt.add, pbt.tell));
		System.out.println("'" + phoneBookmap.get(pbt.name).getName() + "' 전화번호 수정 완료!!!");

		System.out.println(phoneBookmap.get(pbt.name)); // 테스트 코드
	}
	
	public void delete() {
		PhoneBookTest pbt = new PhoneBookTest();
		
		System.out.println("삭제할 전화번호 정보를 입력하세요.");
		System.out.print("이     름 >> ");
		pbt.name = pbt.sc.nextLine();
		if(phoneBookmap.get(pbt.name) == null) {
			System.out.println("등록된 이름이 없습니다.");
			pbt.delete();
		}
		phoneBookmap.remove(pbt.name);
		System.out.println("'" + pbt.name + "' 전화번호 삭제 완료!!!");
	}
	
	public void search() {
		PhoneBookTest pbt = new PhoneBookTest();
		
		System.out.println("검색할 전화번호 정보를 입력하세요.");
		System.out.print("이     름 >> ");
		String name = pbt.sc.nextLine();
		System.out.println("이름 : " + phoneBookmap.get(name).getName());
		System.out.println("전화번호 : " + phoneBookmap.get(name).getTell());
		System.out.println("주소 : " + phoneBookmap.get(name).getAdd());
	}
	
	public void listAll() {
		System.out.println("----------------------------------------");
		System.out.println("번호        이름          전화번호                     주소");
		System.out.println("----------------------------------------");
		int cnt = 0;
		for(String key : phoneBookmap.keySet()) {
			cnt++;
			Phone value = phoneBookmap.get(key);
			System.out.println(cnt + "      " + value.getName() + "       " + value.getTell() + "     " + value.getAdd());
		}
		System.out.println("----------------------------------------");
	}
	
	public static void main(String[] args) {
		
		PhoneBookTest pbt = new PhoneBookTest();
		pbt.start();
		
	}
	
}

class Phone {
	
	private String name;
	private String add;
	private String tell;
	
	public Phone() {}
	public Phone(String name, String add, String tell) {
		super();
		this.name = name;
		this.add = add;
		this.tell = tell;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getAdd() {
		return add;
	}
	
	public void setAdd(String add) {
		this.add = add;
	}
	
	public String getTell() {
		return tell;
	}
	
	public void setTell(String tell) {
		this.tell = tell;
	}
	
	@Override
	public String toString() {
		return "Phone [name=" + name + ", add=" + add + ", tell=" + tell + "]";
	}
	
}


[LottoTest.java]

package kr.or.ddit.basic;

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 LottoTest {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			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("메뉴선택 : ");
			int choice = Integer.parseInt(sc.nextLine());
			if(choice == 1) {
				System.out.println();
				System.out.println("Lotto 구입 시작");
				System.out.println();
				System.out.println("(1000원에 로또번호 하나입니다.)");
				System.out.print("금액 입력 : ");
				int money = Integer.parseInt(sc.nextLine());
				if(money < 1000) {
					System.out.println();
					System.out.println("입력 금액이 너무 적습니다. 로또번호 구입 실패!!!");
					System.out.println();
					continue;
				}else if(money > 100000) {
					System.out.println();
					System.out.println("입력 금액이 너무 많습니다. 로또번호 구입 실패!!!");
					System.out.println();
					continue;
				}
				System.out.println();
				int count = money / 1000;
				System.out.println("행운의 로또번호는 아래와 같습니다.");
				for(int i=0; i<count; i++) {
					HashSet<Integer> lottoSet = new HashSet<Integer>();
					while(lottoSet.size() < 6) {
						lottoSet.add((int)(Math.random() * 45 + 1));
					}
					System.out.println("로또번호" + (i+1) + " : " + lottoSet);
				}
				System.out.println();
				System.out.println("받은 금액은 " + money + "원 이고, 거스름돈은 " + (money - (count * 1000)) + "원 입니다.");
				System.out.println();
			}else if(choice == 2) {
				System.out.println("이용해 주셔서 감사합니다.");
				System.exit(0);
			}else {
				System.out.println("다시 입력해 주세요.");
			}
		}
		
	}

}