IDL/Programming

배열의 값들을 임의의 순서로 재배치하기 (Array Scramble)

이상우_idl 2019. 12. 31. 15:28
728x90
반응형

오늘은 배열 내의 값들을 임의의 순서로 재배치하는 방법 및 관련 프로그램을 소개해보기로 하겠습니다. 이 얘기는 결국 배열 내에 포함된 값들의 순서를 무작위로 휘저어서(Scramble) 다시 재배치한다는 뜻인데요. 예를 들어 다음과 같이 1부터 6까지 6개의 정수들로 구성된 배열이 있다고 합시다.


arr = [1, 2, 3, 4, 5, 6]


이 배열을 구성하고 있는 값들은 이와 같이 1부터 6까지의 정수들이 순서대로 정렬되어 있습니다. 그런데 이 배열의 원소값들을 휘저어서 순서를 뒤죽박죽 임의의 순서로 재배치하는 것입니다. 예를 들면 다음과 같은 모습도 가능할 것입니다.


arr = [421635]


물론 임의로 재배치하는 것이기 때문에, 값들의 순서는 매번 다르게 나와야 할 것입니다. 이와 같이 임의의 순서로 재배치하려면 어떻게 처리를 해야 할까요? 얼핏 보면 간단한 문제일 것처럼 보이지만, 막상 이러한 처리 알고리즘을 생각해보면 그리 간단한 문제는 아닐 것입니다. 결국 이 작업은 원래 배열에서 어떤 값이 위치한 인덱스를 임의의 다른 인덱스로 바꿔주는 작업의 반복이라고 볼 수 있습니다. 물론 "임의의 다른 인덱스"는 대상 배열에 대하여 유효한 범위 내에 있어야 합니다. 이 예제에서는 0~5 범위 내에서 임의의 값이 되어야 할 것입니다. 그리고 반복적으로 임의로 다른 인덱스를 배정하는 과정에서 혹시라도 중복되는 값이 발생할 경우에는 이를 피해가는 것도필요할 것입니다. 이와 같이 적절한 알고리즘을 고민해보자면 아주 간단한 일은 아닐 것 같습니다.


그래서 제가 나름대로의 알고리즘을 사용하여 이와 같은 작업을 수행하는 함수형 프로그램을 하나 만들어보았습니다. 이 프로그램의 이름은 array_scramble입니다. 코드 파일인 array_scramble.pro는 아래 링크를 통하여 받으실 수 있습니다. (이 파일을 다운로드했을 때 파일명의 확장자가 반드시 .pro가 되도록 해야 합니다. 혹시나 .txt까지 붙을 경우에는 지우고 .pro까지만 남도록 하면 됩니다)


파일 다운로드


이 프로그램의 세부 알고리즘에 대해서는 제가 여기서 구구절절 설명을 하지는 않겠습니다. 궁금하신 분들은 코드 파일의 내용을 한번 보시기 바랍니다. 사용법은 간단합니다. 다음과 같이 대상 배열을 인수로 넣어주기만 하면 됩니다.


IDL> arr = INDGEN(6)+1

IDL> PRINT, arr

       1       2       3       4       5       6

IDL> arr_new = ARRAY_SCRAMBLE(arr)

IDL> PRINT, arr_new

       3       2       5       1       4       6


이와 같이 원래 배열에 대하여 순서가 뒤죽박죽된 결과 배열을 얻을 수 있습니다. 물론 무작위로 작업하기 때문에 동일한 작업을 다시 한번 실행해주면 결과는 다르게 나옵니다.


IDL> arr_new = ARRAY_SCRAMBLE(arr)

IDL> PRINT, arr_new

       2       6       5       1       4       3


그리고 인수로 투입되는 배열은 다차원이어도 상관없습니다. 예를 들어 다음과 같이 3x3의 형태를 갖는 배열을 투입해도 됩니다.


IDL> arr = INDGEN(3, 3)+1

IDL> PRINT, arr

       1       2       3

       4       5       6

       7       8       9

IDL> arr_new = ARRAY_SCRAMBLE(arr)

IDL> PRINT, arr_new

       9       5       7

       4       1       2

       8       6       3


이와 같이 배열 내 값들을 무작위 순서로 재배치하는 일이 얼마나 자주 필요할지는 저도 잘 모르겠습니다. 하지만 저도 일을 하다보니 이런 처리가 필요한 경우가 간혹 있었기 때문에, 이렇게 하나 만들어서 여러분과 공유를 해봅니다. 여러분들도 필요하시다면 사용을 해보시고, 혹시라도 링크된 파일의 다운로드가 잘 안된다거나 사용시 이상한 부분이 발견된다면 여길 통해서 제보해주시기 바랍니다.

반응형