Code

배열 섞기 (난수발생, 자리수구하기)

MuGrammer 2013. 1. 5. 02:18

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