배열의 활용(3)~(4)
배열의 활용(3)
- 섞기(shuffle) 배열의 요소의 순서를 반복해서 바꾼다.(숫자 섞기, 로또번호 생성)
[Ex5_4]
import java.util.Arrays;
public class Ex5_4 {
public static void main(String[] args) {
int[] numArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.toString(numArr));
for (int i = 0; i < 100; i = i + 1) {
int n = (int)(Math.random() * 10); // 0~9중의 한 값을 임의로 얻는다.
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] = tmp;
}
System.out.println(Arrays.toString(numArr));
}// main의 끝
}
[실행 결과]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 0, 4, 8, 6, 5, 1, 9, 2, 7]
numArr 배열에 0부터9까지 넣어서 저장해서 출력하면 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]이렇게 나온다.
그리고 for문 반복문을 이용해서 numArr배열 요소의 순서를 섞는다.
100번 반복해서 두 요소값을 바꾼다.
바꾸는 방법은, (int)(Math.random() * 10을 이용해서 0~9중 임의의 한 값을 얻어서 변수n에 저장한다.
0~9중 임의의 한 값을 얻는 이유는 numArr의 인덱스 범위가 0~9이기 때문이다.
예를 들어 n에 4가 저장되었다고 가정해보자.
그러면, numArr의 첫번째 요소와 numArr[4]가 서로 교환된다.
이것을 100번 반복하는 것이다.
100번 반복해서 배열을 섞은 뒤,
System.out.println(Arrays.toString(numArr));으로 배열요소를 출력하면
[3, 0, 4, 8, 6, 5, 1, 9, 2, 7] 이러한 형태로 처음 배열의 요소값이 뒤섞인 형태로 출력된다.
즉, 배열을 섞는 방법은 임의의 두 요소 값을 서로 바꾸면 된다.
아래 그림은 교환 프로세스를 나타낸 그림이다.
(int)(Math.random() * 10의 값이 3이 나왔다고 가정한 것이다.
이러한 방식으로 배열의 두 요소 값을 바꾸는 것이다. (tmp변수 활용)
위의 코드는 numArr[n]의 요소를 numArr[0]요소와만 바꾸도록 되어있는데,
이것을 좀더 개선하여 numArr[n]의 요소가 numArr[i]번째 요소와 교환되도록 코드를 수정하면 아래와 같다.
[Ex5_4를 수정한 코드]
// i번째 요소랑 바꾸는 코드
int[] numArr2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.toString(numArr));
for (int i = 0; i < numArr.length; i = i + 1) {
int n = (int)(Math.random() * 10); // 0~9중의 한 값을 임의로 얻는다.
int tmp = numArr2[i];
numArr2[i] = numArr2[n];
numArr2[n] = tmp;
}
System.out.println(Arrays.toString(numArr2));
이렇게하면 반복문을 100번씩 할 필요 없이 배열의 길이만큼만 반복해도 된다. (좀더 효율적)
다음 예제를 보자.
[Ex5_5] - 로또번호 생성 예제
import java.util.Arrays;
public class Ex5_5 {
public static void main(String[] args) {
int[] ball = new int[45]; // 45개의 정수값을 저장하기
// index : 0~44
// 배열의 각 요소에 1~45의 값을 저장한다.
for(int i = 0; i < ball.length; i = i + 1)
ball[i] = i + 1; // ball[0]에 1이 저장된다.
// System.out.println(Arrays.toString(ball));
int tmp = 0; // 두 값을 바꾸는데 사용할 임시변수
int j = 0; // 임의의 값을 얻어서 저장할 변수
// 배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 저장
// 0번째 부터 5번쨰 요소까지 모두 6개만 바꾼다.
for (int i = 0; i < 6; i = i + 1) {
j = (int)(Math.random() * 45); // 0~44범위의 임의의 정수를 생성
tmp = ball[i];
ball[i] = ball[j];
ball[j] = tmp;
// System.out.println(Arrays.toString(ball));
}
for (int i = 0; i < 6; i = i + 1) {
System.out.println("ball["+i+"]="+ball[i]);
}
}
}
[실행 결과]
ball[0]=20
ball[1]=7
ball[2]=30
ball[3]=28
ball[4]=37
ball[5]=44
로또번호 생성예제의 동작 방식은,
int타입의 ball 배열에 45개의 정수값을 저장하는데, 이때 저장하는 값은 1~45이다.
1~45를 저장하는 방식은 for문을 이용하여 배열의 각 요소의 index+1을 저장하게 된다.
그리고 두개의 변수를 생성하는데,
하나는 두 값을 바꾸는데 사용할 임시변수 tmp이고,
하나는 Math.random()메서드로 임의이 값을 얻어서 저장할 변수 j이다.
그다음 교환을 진행하는 for문에서는,
(int)(Math.random() * 45); 를 이용하여 0~44범위의 임의의 정수를 생성해서 하고,
for문의 i값을 ball배열의 요소값을 지정하는 인덱스로 사용하여 ball[0]~ball[5]에 있는 요솟값을 바꿔준다.
이때, 각 인덱스에 해당하는 요소값은 for문을 돌때마다 생성되는 j값과 교환된다.
이게6번 반복되면, 0~44까지 저장되어 있는 배열 ball의 ball[0]~ball[5]의 요솟값을 0~44사이의 임의의 값으로 교환할 수 있다.
'JAVA' 카테고리의 다른 글
String클래스 (0) | 2022.03.23 |
---|---|
String배열 (0) | 2022.03.23 |
배열의 활용(1)~(2) (0) | 2022.03.22 |
배열의 출력 (0) | 2022.03.22 |
배열의 길이, 배열의 초기화 (0) | 2022.03.22 |