본문 바로가기

JAVA/JAVA 공부

Java 배열을 섞는 방법

Java 배열을 섞는 방법

자바에서 배열에 들어있는 원소를 셔플하는(섞는) 여러가지 방법이 등장했고, 사용되고 있다.

그 중 가장 맘에 들고 직관적인 것을 사용하면 된다. 오늘 필자는 2가지의 방법을 소개하려고 한다.

  • boolean 스위치
  • 랜덤 Swap

Boolean 스위치

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class shuffle{
  public static void main(String[] args){
    int arr[] = new int[50];
 // int arr[] 0 ~ 49까지의 객체를 옮길 빈방을 생성한다.
    
    boolean _switch[] = new boolean[arr.length];
 // boolean _switch[] 방생성 = new boolean[arr의 방생선된 전체의 길이 0 ~ 49]  
   
 
//배열에 0부터 49까지의 숫자를 순서대로 삽입한다.  
    for (int i=0; i<arr.length; i++){   
      arr[i] = i;
    }
    System.out.println("\n섞기 전");
    for (int i=0; i<arr.length; i++){
      System.out.print(arr[i]+" ");
    }
 
    //불리언 스위치를 true로 전부 초기화 한다.
    for (int i=0; i<_switch.length; i++){
      _switch[i] = true;
    }
 
    int w=0;
    int r;
    while (w<arr.length){
      //0~49의 랜덤수의 index를 갖는 _switch배열의 원소가
      //true이면 if문을 실행한다.
     
      //ex 랜덤수가 4이면 _switch[4]는 false가 되고,
      //다음에 다시 4가 나와도 아무일도 일어나지 않고 while문을 돈다.
      //그렇게 모든 switch배열이 false로 바뀌면 shuffle이 완료 된다.
 
      r = (int)(Math.random() * arr.length);  
// int arr =  length ( 범위: 0 ~ 49 ) Random으로 ,
      
     if(_switch[r]){
        _switch[r] = false;
        arr[w] = r;
        w++;
      }
    }
    System.out.println("\n섞은 후");
    for (int i=0; i<arr.length; i++){
      System.out.print(arr[i]+" ");
    }
  }
}
 
cs



1
2
3
4
섞기 전
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
섞은 후
27 44 37 47 30 40 14 22 32 10 46 17 35 29 12 41 21 23 33 39 48 45 25 34 11 31 42 13 38 43 18 28 20 19 16 36 26 24 49 15
cs

Boolean 타입의 배열의 원소를 스위치로 사용하여 arr 배열에 원소를 저장할지 안할지를 판단한다.



Random swap(랜덤 스왑)

랜덤한 수를 뽑아서 배열에 인덱스로 사용하여 배열을 마구 잡이로 섞는다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class shuffle{
  public static void main(String[] args){
    int arr[] = new int[50];

    //배열 초기화
    for (int i=0; i<arr.length; i++){
      arr[i] = i;
    }
    System.out.println("\n섞기 전");

    for (int i=0; i<arr.length; i++){
      System.out.print(arr[i]+" ");
    }
 
    int w=0;
    int r;
    int temp;
    while(w < arr.length){
      //0~49의 수를 랜덤하게 뽑아낸다.
      r = (int)(Math.random()*arr.length);
      //만약 두 인덱스가 다르다면

      if(w!=r){
        //swap으로 값을 바꾼다.
        temp = arr[w];
        arr[w] = arr[r];
        arr[r] = temp;
        w++;
      }
    }
    System.out.println("\n섞기 후");
    for (int i=0; i<arr.length; i++){
      System.out.print(arr[i]+" ");
    }
  }
}
 
cs

1
2
3
4
5
섞기 전
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
섞기 후
31 27 37 12 24 36 30 13 46 26 28 29 44 14 38 43 22 40 15 47 19 21 10 11 33 25 45 16 42 34 39 20 32 18 41 35 48 49 17 23 4
 
cs
위 방법이 조금 더 쉽게 다가갈수 있다. 배열의 주소가 다른 두 원소의 위치를 바꾸기만 하면 된다. 그럼 무작위로 수가 섞이는 효과를 볼 수 있다.



정리

위와 같은 방법 뿐만 아니라 다른 많은 섞기 방법이 존재한다. 내가 지금까지 본 섞기 방법보다 획기 적이고 효과적인 방법이기 때문에 포스팅하게 되었다. Boolean 스위치를 이용하는 방법은 실무에서도 적지 않게 사용한다고 하니 숙지해두는 것이 좋을 듯 하다.


출처 : https://qkrrudtjr954.github.io/java/2017/11/13/java-array-shuffle.html


'JAVA > JAVA 공부' 카테고리의 다른 글

randomClass  (0) 2018.06.26
operatorClass  (0) 2018.06.26
10진수를 2진수, 16진수로 변환하는 방법  (0) 2018.06.20
Java 버블 소트  (0) 2018.06.20
Java의 이중배열  (0) 2018.06.20