public class MugrammerShuffle {
public static int[] shuffle(int[] arr){
/*
* Math.random 함수를 사용하여 배열을 섞는다.
* 난수 두 개를 생성하여 각 난수를 위치로하는 배열의 값을 바꾼다.
*/
// 배열의 자리수를 판별한다.
// 배열의 길이에 10을 곱하고 문자열로 변환한 다음 마지막 0의 위치가 배열의 자리수이다.
// Integer.toString(arr.length*10).lastIndexOf("0")
// 9*10 = 90 ==> 마지막 0의 위치 : 1
// 88 * 10 = 880 ==> 마지막 0의 위치 : 2
int placeNum = 1;
for(int i=0; i < Integer.toString(arr.length*10).lastIndexOf("0"); i++){
placeNum *= 10;
}
// 배열의 값을 섞는다.
// Math.random() 은 0.XXXXX 값을 가지므로
// 1자리 일 경우 *10, 2자리 일 경우 *100을 하여 해당 자릿수 이하의 정수를 생성한다.
// 이 정수를 실제 배열의 길이로 나눈 나머지 값을 구한다.
// ex) 배열의 길이 12
// Math.random()*100 = 23
// 23 % 12 = 11
for(int i=0; i < placeNum*10; i++){
int a1 = (int)(Math.random()*placeNum % arr.length);
int a2 = (int)(Math.random()*placeNum % arr.length);
int temp;
temp = arr[a1];
arr[a1] = arr[a2];
arr[a2] = temp;
}
return arr;
}
public static void main(String[] args) {
int[] original = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,6,7,8};
System.out.println(java.util.Arrays.toString(original));
int[] result = shuffle(original);
System.out.println(java.util.Arrays.toString(result));
}
}
위 내용은 Java의 정석 연습 문제를 풀면서 작성해 본 소스입니다.
'배열을 입력받아 임의적으로 배열의 값을 섞어라. ' 가 문제입니다.
전 난수 2개를 발생시켜 해당 난수가 가리키는(?) 두 배열의 값을 교환하는 방식을 택했습니다.
배열의 자리수는 변경될 수 있기 때문에 자리수를 구하여 배열 길이내에서 난수가 발생될 수 있도록 하였습니다.
배열의 길이를 벗어나는 난수가 나오면 오류가 발생하기 때문이죠.
잠이 오지 않는 밤 그냥 심심풀이로..
프로그래밍에는 정답이 없으니까요.
'Code' 카테고리의 다른 글
codility - TapeEquilibrium (0) | 2020.08.15 |
---|---|
Codility- PermMissingElem (0) | 2020.08.14 |
자바의 정석 문제풀이(4_15) (0) | 2012.04.13 |
자바의 정석 문제풀이(4_14) (0) | 2012.04.08 |
자바의 정식 문제풀이(4_13) (0) | 2012.04.02 |