Java 배열을 섞는 방법

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

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

  • boolean 스위치
  • 랜덤 Swap

Boolean 스위치

class shuffle{
  public static void main(String[] args){
    int arr[] = new int[50];
    boolean _switch[] = new boolean[arr.length];

    //배열에 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);
      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]+" ");
    }
  }
}
섞기 전
0 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 48 49
섞은 후
3 27 44 37 47 30 40 14 22 0 2 32 10 46 17 35 29 12 41 21 23 7 4 33 39 48 9 45 25 34 11 31 8 42 13 38 43 18 28 20 5 19 16 36 6 26 24 1 49 15

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




Random swap(랜덤 스왑)

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

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]+" ");
    }
  }
}
섞기 전
0 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 48 49
섞기 후
31 27 5 37 9 12 2 24 36 30 13 46 26 28 29 44 1 14 38 43 22 3 0 40 15 47 6 19 21 10 11 33 25 45 16 42 7 34 39 20 8 32 18 41 35 48 49 17 23 4

위 방법이 조금 더 쉽게 다가갈수 있다. 배열의 주소가 다른 두 원소의 위치를 바꾸기만 하면 된다. 그럼 무작위로 수가 섞이는 효과를 볼 수 있다.



정리

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

Comments