Juwan Park :: .shuffle - 배열의 원소들을 뒤섞는 메소드

.shuffle - 배열의 원소들을 뒤섞는 메소드

★프로그래밍/Ruby :: 2016.08.24 12:59

이전 포스트에서 루비 프로그래밍에는 배열에 .sort 메소드가 있다는 글을 작성했습니다.

.sort 메소드는 별도의 알고리즘 구현 없이 원소들이 이리저리 뒤섞인 배열을 원소의 값대로 정렬해 주는 메소드라고 하였습니다. 그러면 정반대로 원소들을 이리저리 뒤섞는 메소드도 있을까요? 네. 있습니다.

일단 아래 코드를 봅시다.

arr = Array.new
1.upto(10) {|x| arr << x }
puts sprintf("%s", arr)
(arr.length * 10).times do
	t1 = rand(arr.length)
	t2 = rand(arr.length)
	arr[t1], arr[t2] = arr[t2], arr[t1]
end
puts sprintf("%s", arr)

이 코드를 실행하면,

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[8, 1, 6, 2, 9, 4, 5, 10, 7, 3]

이렇게 먼저 1부터 10까지 차례로 정렬된 상태의 배열 arr를 먼저 출력하고 랜덤으로 뒤섞은 후 그 결과를 출력하게 됩니다.

4번 줄부터 8번 줄까지의 블록이 일반적으로 쓰이는 뒤섞기 알고리즘입니다. 루비 1.8.7부터는 이 알고리즘 없이 배열 뒤섞기를 할 수 있습니다. 왜냐하면 .shuffle 메소드가 추가되었기 때문입니다.

앞의 코드에서 뒤섞기 알고리즘 부분을 없애버리고 .shuffle 메소드로 대체해 봅시다.

arr = Array.new
1.upto(10) {|x| arr << x }
puts sprintf("%s", arr)
puts sprintf("%s", arr.shuffle)

이와 같이 9줄이던 코드가 4줄로 줄었습니다. 하지만,

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[4, 6, 9, 2, 7, 3, 10, 1, 5, 8]

실행 결과는 같습니다. 달라진 건 뒤섞기의 결과 뿐입니다. 물론 뒤섞기의 특성상 실행할 때마다 결과가 달라지는 건 당연한 얘기지만...

그리고, .sort 메소드와 마찬가지로 .shuffle 메소드도 느낌표가 붙고 안 붙고의 차이가 있습니다. .sort와 .sort!의 차이가 전자는 그냥 정렬만 하고 후자는 정렬한 결과를 원래 배열에 그대로 덮어 쓰는 차이가 있듯이, .shuffle과 .shuffle!의 차이 역시 그냥 뒤섞기만 하느냐 아니면 그 결과물을 그대로 원래 배열에 저장하느냐의 차이입니다. 그 차이를 알아보기 위하여 다음과 같이 코딩을 해 봅시다.

arr = Array.new
1.upto(10) {|x| arr << x }
puts sprintf("%s", arr)
puts sprintf("%s", arr.shuffle)
puts sprintf("%s", arr)
puts sprintf("%s", arr.shuffle!)
puts sprintf("%s", arr)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[6, 4, 3, 10, 7, 8, 9, 2, 1, 5]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[7, 8, 1, 4, 3, 9, 2, 6, 10, 5]
[7, 8, 1, 4, 3, 9, 2, 6, 10, 5]

이와 같습니다. 일단 정렬 상태의 배열을 출력하고 그 다음 느낌표를 안 붙이고 그냥 .shuffle 메소드만 써서 출력하면 출력은 뒤섞인 상태로 출력되지만 그 결과값이 원래 배열에 저장되지는 않기 때문에 .shuffle 메소드를 빼고 재출력하면 정렬된 원래 배열대로 나옵니다. 하지만 .shuffle 메소드 뒤에 느낌표를 붙이고 출력하면 뒤섞인 상태로 출력됨과 동시에 그 결과값이 원래 배열에 저장되므로 바로 다음에 .shuffle 메소드를 빼고 재출력해도 바로 그 뒤섞인 결과대로 나오게 됩니다.

.sort 메소드와 마찬가지로 .shuffle 메소드 역시 문자열이나 배열 등도 순서를 뒤섞을 수 있습니다. 다만 .sort 메소드와 달리 .shuffle 메소드는 배열 안의 여러 자료형이 섞여 있어도 정상적으로 동작합니다.

# 다음 코드들은 정상적으로 실행됩니다.
  ["소원", "예린", "은하", "유주", "신비", "엄지"].shuffle
  [1, 2, 3.14, "넷", "오", true, false, nil, [1, 2]].shuffle


여기서 루비 배열의 shuffle 메소드에 대한 설명을 마칩니다.

루비에서는 이런 방법으로 데이터 뒤섞기를 편리하게 처리할 수 있습니다.

많은 도움 되셨나요?

유용한 정보로 활용하시기를 바랍니다.

댓글을 달아 주세요.

Today 3    Yday 43    Tot 70,248
Juwan Park
Juwan Park's blog is powered by Daum and TISTORY.
Contemporary Blue for TISTORY.
Designed by Juwan Park. Creative Commons License
▲ TOP