고급JAVA 3강 - Set, Iterator

Whatever·2021년 11월 1일
0

고급 JAVA

목록 보기
3/32

List와 Set의 차이점

  1. List
  • 데이터의 순서(index)가 있다.
  • 중복된 데이터를 저장할 수 있다.
  1. Set
  • 데이터의 순서(index)가 없다.
  • 중복되는 데이터를 저장할 수 없다.
       HashSet hs1 = new HashSet<>();
	
	//데이터 추가 : add()메서드 이용
	hs1.add("DD");
	hs1.add("AA");
	hs1.add(2);
	hs1.add("CC");
	hs1.add("BB");
	hs1.add(1);
	hs1.add(3);
	
	//Set에 들어가면 데이터가 섞인다.
	System.out.println("set ==> " + hs1);
	System.out.println("set의 개수 => " + hs1.size());
	System.out.println();
	
	//set에 중복되는 데이터를 추하기면 false를 반환하고 데이터는 추가되지 않는다.
	boolean isAdd = hs1.add("FF");
	System.out.println("중복되지 않을 때 : " + isAdd);
	System.out.println("set ==> " + hs1);
	
	isAdd = hs1.add("CC");
	System.out.println("중복될 때 : " + isAdd);
	System.out.println("set ==> " + hs1);
	System.out.println();
	
	//Set의 데이터를 수정하려면 수정하는 명령이 따로 없기 때문에 
	//해당 자료를 삭제한 후에 추가해주는 방식으로 처리한다.
	
	//삭제하는 메서드 : 
	//remove(삭제할 데이터) => 반환값 : 삭제성공(ture), 삭제실패(false)
	//clear() => 전체 데이터 모두 삭제
	
	//"FF" 데이터를 "EE"로 변경하기 
	hs1.remove("FF");
	System.out.println("삭제한 후 set => " + hs1);
	hs1.add("EE");
	System.out.println("set => " + hs1);
	
	//hs1.clear();
	//System.out.println("전체 삭제 후 set => " + hs1);
	
	/*
	Set의 데이터는 순서(index)가 없기 때문에 List처럼 index로 데이터르 하나씩 불러올 수 없다.
	그래서 데이터를 하나씩 얻기 위해서는 Iterator형 객체로 변환해야 한다. 
	
	- Set형의 데이터들을 Iterator형 객체로 변환하는 메서드 => iterator()
	*/
	
	Iterator it = hs1.iterator(); //Set 데이터를 Iterator로 변환하기
	
	// Iterator의 hasNext()메서드
	// ==> Iterator의 포인터가 가리키는 곳 다음 번째에 데이터가 있는지 검사한다. 
         (데이터가 있으면 ture, 없으면 false반환) 
	while(it.hasNext()) {
		// Iterator의 next()메서드
		// ==> Iterator의 포인터가 가리키는 곳 다음 번째 위치로 이동한 후 
                       그 곳의 데이터를 읽어와 반환한다.
		System.out.println(it.next());
		
	}
	System.out.println();
	
	//향상된 for문을 사용하면 Iterator를 사용한 효과를 낼 수 있다.
	for(Object data : hs1) {
		System.out.println(data);
	}
	
	//우리반 학생들 중 번호를 이용하여 추첨하는 프로그램을 작성해보자.
	//번호는 1번부터 24번까지 있고, 추첨할 인원은 3명이다.
	//당첨자를 출력해보시오.
	
	//최소값부터 최대값 사이의 정수형 난수 만들기
	//(int)(Math.random() * (최대값-최소값+1) + 최소값)
	
	HashSet<Integer> testSet = new HashSet<>();
	//중복되지 않는 값을 저장
	while(testSet.size() < 3) { //3은 내가 만들고자 하는 개수
		testSet.add((int)(Math.random() * 24 + 1)); //1~24까지의 난수를 만듦.
	}
	
	System.out.println("당첨자 번호 : " + testSet);
	System.out.println();
	
	//Set유형의 데이터를 List형으로 변환하기
	ArrayList<Integer> testList = new ArrayList<>(testSet);
        //List를 만들 때 Set에 있는 객체만큼 데이터가 만들어짐.
	
	System.out.println("List 데이터 출력");
	for(int i = 0; i < testList.size(); i++) {
		System.out.println(testList.get(i));
	}
	
	// 로또번호 만들기 
	HashSet<Integer> lotto = new HashSet<>();
	while(lotto.size() < 6) {
		lotto.add((int)(Math.random() * 45 + 1));
	}
	
	System.out.println("로또번호 : " + lotto);
    
    
    

BaseBall Game

/*
문제) Set을 이용하여 숫자 야구 게임 프로그램을 작성하시오.
(컴퓨터의 숫자는 난수를 이용하여 구한다.)
(스트라이크는 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번만에 맞췄습니다.

*/

프로그램 --- 입력버퍼 --- 키보드
입력버퍼에 데이터가 없으면 키보드로 입력받음
입력한 데이터는 바로 프로그램이 아닌 입력버퍼에 들어감
한 줄 전체를 프로그램에 가져가는 것 : nextLine()
nextLine이 아닌 메서드를 사용하면 띄어쓰기를 기준으로 자료를 구분하여 저장한다.

public class BaseBallTest {

ArrayList<Integer> numList; //난수가 저장될 List
ArrayList<Integer> userList; //사용자가 입력한 값이 저장될 List

int strike, ball; //스트라이크 개수와 볼의 개수가 저장될 변수 선언

Scanner sc = new Scanner(System.in);

//1 ~ 9 사이의 서로 다른 난수 3개를 만들어서 List에 저장하는 메서드
//Set을 이용한다.
public void getNum() {
	Set<Integer> numSet = new HashSet<Integer>();
	
	//1 ~ 9 사이의 난수 3개 만들기
	while(numSet.size() < 3) {
		numSet.add((int)(Math.random() * 9 + 1));
	}
	
	//만들어진 난수를 List에 저장하기
	numList = new ArrayList<>(numSet);
	
	//List의 데이터를 섞어준다.
	Collections.shuffle(numList);
	
}

//사용자로부터 3개의 정수를 입력받아 List에 저장하는 메서드
//입력한 정수는 중복되지 않게 한다.
public void inputNum() {
	int n1, n2, n3; //입력한 정수가 저장될 변수 선언
	
	do {
		System.out.print("숫자입력>");
		n1 = sc.nextInt();
		n2 = sc.nextInt();
		n3 = sc.nextInt();
		
		if(n1 == n2 || n1 == n3 || n2 == n3) {
			System.out.println("중복되는 숫자는 입력할 수 없습니다.");
			System.out.println("다시 입력하세요.");
		}
	}while(n1 == n2 || n1 == n3 || n2 == n3);
	
	//입력받은 데이터를 List에 저장한다.
	userList = new ArrayList<>();
	userList.add(n1);
	userList.add(n2);
	userList.add(n3);
}

//스트라이크와 볼을 판정하고 출력하는 메서드
public void ballCount() {
	strike = 0;
	ball = 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++;
				}
				
			}
		}
	}
	
	//볼 카운트 결과 출력하기
	System.out.println(userList.get(0) + ", " + userList.get(1) + ", " + userList.get(2)
	 + strike + "S " + ball + "B");
}

//게임을 진행하는 메서드
public void startGame() {
	//난수를 만드는 메서드 호출
	getNum();
	
	//확인용 출력
	System.out.println("컴퓨터 난수 : " + numList);
	
	int cnt = 0; //몇 번만에 맞췄는지를 저장하는 변수
	
	do {
		cnt++;
		inputNum(); //사용자 입력용 메서드 호출
		
		ballCount(); //볼카운트 구하기
		
	}while(strike!=3); //3 스트라이크가 될 때까지 반복
	
	System.out.println("축하합니다.");
	System.out.println("당신은 " + cnt + "번째만에 맞췄습니다.");
}


public static void main(String[] args) {
	
	BaseBallTest test = new BaseBallTest();
	test.startGame();
    

내 답
// HashSet answer = new HashSet<>();
//
// //Set구하기
// while(answer.size() < 3) {
// answer.add((int)(Math.random() * 9 + 1));
// }
//
// //ArrayList에 옮겨담기
// ArrayList answerList = new ArrayList<>(answer);
//// System.out.println(answerList);
// //숫자를 입력받는다.
// int count = 0;
// int S;
// int B;
//
// do {
// count++;
// S = 0;
// B = 0;
// System.out.print("세자리 숫자 입력>");
// int num = Integer.parseInt(sc.nextLine());
// //백의자리
// int n1 = num / 100;
// //십의자리
// int n2 = (num % 100) / 10;
// //일의자리
// int n3 = (num % 100) % 10;
//
//
// //자리가 같고, 값이 같으면 S
// if(answerList.get(0) == n1) S++;
// if(answerList.get(1) == n2) S++;
// if(answerList.get(2) == n3) S++;
//
// //자리가 다르고 값이 같으면 B
// if(answerList.get(0) == n2 || answerList.get(0) == n3) B++;
// if(answerList.get(1) == n1 || answerList.get(1) == n3) B++;
// if(answerList.get(2) == n1 || answerList.get(2) == n2) B++;
//
// System.out.println(S + "S " + B + "B");
// }while(S < 3);
//
// System.out.println("축하합니다. 당신은 " + count + "번 만에 맞았습니다.");
}

0개의 댓글