21-java - 1차원 배열&이중 반복문 심화 문제들

jin·2022년 5월 26일
0

1. MAX 게임

  1. 가장 큰 값을 찾아 입력한다.
  2. 정답이면 해당 값을 0으로 변경한다.
  3. arr배열의 모든 값이 0으로 변경되면 프로그램은 종료된다.
    예)
    11, 87, 42, 100, 24
    입력 : 100

11, 87, 42, 0, 24
입력 : 87

11, 0, 42, 0, 24
입력 : 24 ==> 최대값이 아니므로 아무일안생김


Scanner sc = new Scanner(System.in);
int[] arr = { 11, 87, 42, 100, 24 }; 
int count = 0;
		
while (true) {
	int index = -1;
	int max = 0;
	if (count == arr.length) {
		break;
	}
	System.out.print("최대값 입력 : ");
	int num = sc.nextInt();
	// 1. 최대값 찾기 
	for (int i = 0; i < arr.length; i++) {
		if (arr[i] > max) {
			max = arr[i];
			index = i;
		}
	}
	if (index == -1) {
		System.out.println("해당값 없음");
		continue;
	}
	// 2. 입력값과 비교
	if (max == num) {
		arr[index] = 0;
		count += 1;
		System.out.println("정답");
	} else {
		System.out.println("오답");
	}
	System.out.println(Arrays.toString(arr));
}
System.out.println();
System.out.println(Arrays.toString(arr));

index 초기값을 -1로 생성하고 해당 인덱스가 없으면 비교하지 않도록 처리했다.
처음에 for문 안에서 max값과 입력값을 다 찾다가 망해서 반복 돌고 검사하니 무사히 해결됐다.

2. 기억력 게임

  1. 같은 글자가 적혀있는 카드 2장씩 5세트가있다. (총10장)

  2. front 는 카드를 엎어논 상태를 뜻한다.

  3. 먼저 front 를 셔플한다.

  4. front 에 있는 카드 2개를 선택한다. (마우스가없으므로 인덱스로 선택)

  5. 선택한카드 2장의 내용이 같으면 back 에 복사해서 맞춘걸 표시한다.
    back에 모든 글자 가 채워지면 게임은 종료된다.

    [조건] 같은 인덱스 선택할수없다.

예)
[1] 초기화
front = {'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd', 'e', 'e' };
back = {'-', '-', '-', '-', '-', '-', '-', '-', '-', '-' };

[2] 셔플
front = {'a', 'e', 'c', 'b', 'd', 'c', 'b', 'd', 'a', 'e'};

[3] 인덱스 입력
1) 인덱스 2개 ==> 0 , 8 ==>front 배열의 인덱스 0, 과 8 의 값은 a , a 로 서로 같은 내용이므로 back 에 복사
back = {'a', '-', '-', '-', '-', '-', '-', '-', 'a', '-' };
2) 인덱스 2개 ==> 1 , 2 ==>front 배열의 인덱스 1, 과 2의 값은 e , c 로 서로 다른글자이므로 아무일없음
back = {'a', '-', '-', '-', '-', '-', '-', '-', 'a', '-' };


Scanner sc = new Scanner(System.in);
Random rnd = new Random();
		
char[] front = {'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd', 'e', 'e'};
char[] back = {'-', '-', '-', '-', '-', '-', '-', '-', '-', '-'};
int[] arr = new int[10];

int count = 0; //맞출때마다 1 증가 ===> back.length/2까지
char temp = 0;
// 1. 셔플 ===> 0~9 랜덤한 두 난수 
for (int i = 0; i < 1000; i++) {
	int rNum1 = rnd.nextInt(9);
	int rNum2 = rnd.nextInt(9);
	temp = front[rNum1];
	front[rNum1] = front[rNum2];
	front[rNum2] = temp;
//			System.out.printf("rNum1 : %d / rNum2 : %d /  ", rNum1, rNum2);
//			System.out.println(Arrays.toString(front));
}
System.out.println(Arrays.toString(front));

while (true) {
	boolean check = false;
	if (count == back.length/2) {
		System.out.println("게임끝");
	break;
}
// 2. 같은 알파벳 인덱스 입력
System.out.print("첫번째 인덱스 : ");
int index1 = sc.nextInt();
System.out.print("두번째 인덱스 : ");
int index2 = sc.nextInt();
// 3. 유효성 검사
for (int i = 0; i < arr.length; i++) {
	if (arr[index1] != 0 || arr[index2] != 0) {
		System.out.println("이미 찾은 카드임");
		check = true;
		break;
	}
}
// 4. 인덱스 값들 찾기
char alphabet1 = front[index1];
char alphabet2 = front[index2];
if (alphabet1 == alphabet2 && check ==false) {
	System.out.println("정답");
	back[index1] = alphabet1;
	back[index2] = alphabet2;
	arr[index1] = 1;
	arr[index2] = 1;
	count += 1;
	System.out.println(Arrays.toString(back));
	System.out.println(Arrays.toString(arr));
} else if (check == false) {
	System.out.println("오답");
		System.out.println(Arrays.toString(back));
	}
}

어떻게 진행할지 주석으로 쓰고 순서대로 진행했더니 무사히 풀린 문제. 이미 앞에서 다룬 내용들이라 크게 어려운점은 없..으면 좋겠으나 int형 사용하다가 char쓰니 임시변수에 값을 잘못 저장해서 살짝 헤맸다.

3. 미니마블

[미니마블]

  1. 플레이어는 [p1]과 [p2] 2명이다. 한번씩 번갈아 가면서 행동한다.

  2. [1.주사위][2.패스] 를 선택할수있다. 주사위는 (1~4)의 랜덤값을 가진다.

  3. 주사위숫자만큼 현재위치에서 앞으로 이동한다.

  4. 이동한자리가 다른 플레이어와 같은 위치에 놓이게 되면,
    상대 플레이어는 잡히게 되어 맨앞(인덱스 0) 으로 강제 이동된다.

  5. 상대를 잡은 위치가 맨앞(인덱스 0)의 위치에 있을때는 안전지대이다.(잡히지않는다.)

  6. 이동거리가 배열의 마지막위치를 초과하면,
    맨앞(인덱스 0)으로 이동하고 초과한숫자만큼 추가이동한다.

  7. 먼저 3바퀴를 돌면 이긴다.

    [p1] 주사위 : 1
    1 0 0 0 0 0 0 0 0 0
    2 0 0 0 0 0 0 0 0 0

    [p2] 주사위 : 3
    0 1 0 0 0 0 0 0 0 0
    0 0 0 2 0 0 0 0 0 0

    [p1] 주사위 : 2
    [p1]이 [p2]를 잡았다!
    0 0 0 0 1 0 0 0 0 0
    2 0 0 0 0 0 0 0 0 0


Random rnd = new Random();
Scanner sc = new Scanner(System.in);

int[] map1   = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int[] map2   = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int[] count = new int[2];
int p1 = 0;
int p2 = 0;
int select = 0;
int dice = 0;
int goal = map1.length;

int turn = 1;
while (true) {
	System.out.println();
	System.out.printf("p1 : %d 바퀴 \n", count[0]);
	System.out.printf("p2 : %d 바퀴 \n", count[1]);
	System.out.println(Arrays.toString(map1));
	System.out.println(Arrays.toString(map2));
	if (count[0] == 3 || count[1] == 3) {
		if (count[0] == 3) {
			System.out.println("p1 승리");
		}else {
			System.out.println("p2 승리");
		}
		break;
	}
	if (turn % 2 == 1) {
		System.out.println("p1턴");
		System.out.println("[1]주사위 [2]패스");	
		select = sc.nextInt();
		if (select == 1) {
			dice = rnd.nextInt(4)+1;
			map1[p1] = 0;
			p1 += dice;
			if (p1 >= goal) {
				p1 -= goal;
				count[0] += 1;
			}
			map1[p1] = 1;
			System.out.println(dice+"만큼 이동");
		} else if (select == 2) {
			System.out.println("패스");
		}
		turn += 1;
	} else {
		System.out.println("p2턴");
		System.out.println("[1]주사위 [2]패스");	
		select = sc.nextInt();
		if (select == 1) {
			dice = rnd.nextInt(4)+1;
			map2[p2] = 0;
			p2 += dice;
			if (p2 >= goal) {
				p2 -= goal;
				count[1] += 1;
			}
			map2[p2] = 2;
			System.out.println(dice+"만큼 이동");
		} else if (select == 2) {
			System.out.println("패스");
		}
		turn += 1;
	}
	if (p1 == p2 && p1 != 0 && p2 != 0) {
		if (turn % 2 == 1) {
			System.out.println("p1 잡힘");
			map1[p1] = 0;
			p1 = 0;
			map1[p1] = 1;
			turn += 1;
		} else {
			System.out.println("p2 잡힘");
			map2[p2] = 0;
			p2 = 0;
			map2[p2] = 2;
			turn += 1;
		}
	}
}

큰 틀을 잡고 만들었어야 했는데 문제가 쉽다고 작은틀부터 만들다가 갈아엎고 다시 만들었다... 문제가 쉽다고 느껴도 늘 큰 틀을 잡고 만들자

이상으로 이번 챕터는 끝났다. 그런데 다음 챕터가 또 심화판 문제네 그래도 전체진도보다 1.5주 앞섰으니까 심적 안정감은 있다

0개의 댓글