19 - 1차원 배열&이중 반복문

jin·2022년 5월 26일
0

1. 이중 반복문

[이중 for문]
반복문 2개를 사용해서 직사각형의 데이터를 표현할수있다.
1. 첫번째 반복문 (i) 가 세로를 담당한다.
2. 두번째 반복문 (j) 가 가로를 담당한다.

for (int i = 0; i < 4; i++) {
	for (int j = 0; j < 3; j++) {
		System.out.print("[i] = " + i + " [j] = " + j );
	}
	System.out.println();
}

라고 강의 설명되어 있지만 이번 챕터 전에 while문 안에 for문이나 while문 넣는다던지 은연중에 사용된듯한 느낌...

이중 반복문을 이용해 사각형 그리기

[사각형그리기]

아래와같은 사각형을 출력하시오.

###
###
###

1) 단일 for문을 사용할 경우

for(int i=0; i<9; i++) {
	System.out.print("#");
	if(i % 3 == 2) {
		System.out.println();
	}
}

나머지로 판단해서 i가 3, i가 6 이 되면 println로 줄바꿈

2) 이중 for문을 사용할 경우

for (int i = 0; i < 3; i++) {
	for (int j = 0; j < 3; j++) {
		System.out.print("#");
	}
	System.out.println();
}

두번째 for문에서 #을 세번 출력하고 두번째 for문이 끝나면 println로 줄바꿈

2. 이중 반복문과 배열

[중첩반복문과배열]

  • 중첩반복문 3 x 4 을 활용해 1차원배열에 1~12 값넣기
int[] arr = new int[12];
int k=0;
for(int i = 0; i < 4; i++) {
	for (int j = 0; j < 3; j++ ) {
		arr[k] += k + 1; // 0부터 증가이므로 k+1
		k+= 1; // k가 총 12번 증가함
	}
}
System.out.println(Arrays.toString(arr));

단일 for문을 12번 반복해도 나오긴 하지만 이중 for문 예시로 적용된듯 하다.

3. 흔히 범하는 인덱스 중복코드

[문제]
b의 값들 은arr1의 인덱스이다.
arr1배열에서 b의 값들이 가르키는 인덱스의 값을 출력


int arr1[] = {10,20,30,40,50};
int b[] = {1,4,0};

System.out.println("흔히 아래와같이 오류를 범한다.");
System.out.println("b의 값은 arr배열의 인덱스 이므로 아래와같이 복잡하게 찾을필요없다.");
System.out.println("----------------");
for (int i = 0; i < b.length; i++) {
	for (int j = 0; j < arr1.length; j++) {
		if (b[i] == j) {
			System.out.print(arr1[j] + " ");
		}
	}
}
System.out.println();
System.out.println("----------------");
for (int i = 0; i < b.length; i++) {
	int index = b[i];
	System.out.print(arr1[index]+ " ");
}

System.out.println();
System.out.println("----------------");
for (int i = 0; i < b.length; i++) {
	System.out.print(arr1[b[i]] + " "); 
}

나도 많이 작성했던 중복코드로 인덱스가 주어졌음에도 해당 배열에서 인덱스를 또 찾아내는 코드를 작성했다. 효율도 안좋을뿐더러 인덱스 찾아내는 코드의 의미도 없다...

4-1. 중복숫자 해결방법 셔플

Random rnd = new Random();
		
int arr[] = new int[4]; 

for (int i = 0; i < 4; i++) {
	arr[i] = i + 1; // 여기서 중복되지 않는 숫자가 들어가는데 왜 아래에서 100번을?
	// ===> 카드게임같이 수가 많을때는 여러번 섞어야 정상적으로 셔플이 됨
}
System.out.println(Arrays.toString(arr));
for (int i = 0; i < 100; i++) {
	int r1 = rnd.nextInt(4);
	int r2 = rnd.nextInt(4);
	int temp = arr[r1];
//			System.out.println(r1 + " / " + r2);
	arr[r1] = arr[r2];
	arr[r2] = temp;
}
System.out.println(Arrays.toString(arr));

4-2. 중복숫자 해결방법 boolean 타입 배열 활용

Random rnd = new Random();

int[] arr = new int[4];
boolean[] check = new boolean[4];

for (int i = 0; i < 4;) {
	int r = rnd.nextInt(4)+1;
	if (check[r-1] == false) {
		check[r-1] = true;
		arr[i] = r;
		i += 1;
	}
}
System.out.println(Arrays.toString(arr));

4-3. 중복숫자 해결방법 전체검사

Random rnd = new Random();
		
int arr[] = new int[4];

for (int i = 0; i < 4; ) {
	int r = rnd.nextInt(4) + 1;
	boolean check = false;
	for (int j = 0; j < i; j++) {
		if (arr[j] == r) {
			check = true;
			break;
		}
	}
	if (check == false) {
		arr[i] = r;
		i += 1;
	}
}
System.out.println(Arrays.toString(arr));
  1. 셔플

    • 다 각기 다른 번호를 배열에 저장하고 배열 값들의 위치만 바꿔주면 결국 중복숫자는 없지 않나? 생각에 코드만 봤을때 중복검사 셔플의 의미를 몰랐다. 이건 중복'검사'라기 보다는 셔플 말 그대로 섞기에 가까운듯 싶다.
  2. boolean 배열 활용

    • 랜덤한 숫자를 인덱스로 활용해서 해당 난수를 boolean 배열 인덱스 위치에 true로 바꿔준 후 해당 boolean타입이 false인지 확인한다.
  3. 전체검사

    • 이중 for문으로 i번째 해당하는 난수가 다른 위치에 있는지 전부 확인한다. 해당 값이 있으면 boolean 변수가 true로 조건문에 걸리지 않는다. 효율은 제일 좋지 않다.

0개의 댓글