IDL/배열 생성 및 처리

SORT 함수의 이용 방법

이상우_idl 2020. 4. 20. 14:27
728x90
반응형

오늘은 배열에 대한 소팅(sorting) 작업을 위하여 SORT 함수를 활용하는 방법에 관하여 알아보겠습니다. 즉 배열 내에 있는 값들을 크기에 따라 오름차순(Ascending Order) 또는 내림차순(Descending Order)으로 정렬하는 작업에 관한 것입니다. 사실 소팅이라는 작업자체가 배열의 처리에 있어서 꽤 기본적인 것이긴 한데, 제가 이 블로그에서 소팅에 관하여 다른 게시물들에서는 조금씩 다뤄본 적은 있지만 단독으로 얘기해본 적은 의외로 없는 것 같습니다. IDL에서 소팅 작업을 하려면 SORT 함수를 이용하면 됩니다. 그러면 그 방법에 관하여 예제와 함께 살펴보겠습니다. 먼저 예제 데이터를 다음과 같이 생성해 봅시다.


names = ['AA', 'BB', 'CC', 'DD', 'EE', 'FF']

scores = [65, 85, 80, 50, 95, 70]


이 예제 데이터는 6명의 사람들에 대한 이름 및 점수 값들로 구성된 names 및 scores라는 배열입니다. 우선 점수 값들로 구성된 scores배열에 대하여 소팅을 해보겠습니다. 이를 위하여 다음과 같이 SORT 함수를 사용합니다.


rk = SORT(scores)

HELP, rk

PRINT, rk


이와 같이 SORT 함수에 의하여 얻어진 결과를 rk라는 배열로 담았는데요. 이 rk 배열은 원본 데이터 배열인 scores와 크기는 같지만, 배열 내 값들을 오름차순으로 정렬한 순서 정보를 담게 됩니다. 출력된 내용을 보면 다음과 같습니다.


RK              LONG      = Array[6]

         3         0         5         2         1         4


여기서 rk의 값들이 출력된 내용을 보면 3, 0, 5, 2, 1, 4라고 되어 있는데, 배열 scores 내에서 가장 작은 값에 대한 인덱스부터 가장 큰 값에 대한 인덱스까지 오름차순의 순서로 나열된 것입니다. 실제로 가장 작은 값은 50인데 이 값의 인덱스는 3이고, 가장 큰 값은 95인데 이 값의 인덱스는 4입니다. 따라서 SORT 함수의 결과로 얻어지는 배열은 원래 배열의 값들을 오름차순으로 정렬한 순서에 대응되는 인덱스들로 구성됩니다. 그러면 원래 배열인 scores를 오름차순으로 재정렬한 배열을 다음과 같이 별도로 만들 수 있습니다.


scores_sorted = scores[rk]

PRINT, scores_sorted


여기서는 scores_sorted라는 이름으로 생성했고 이 배열의 값들이 출력된 모습은 다음과 같습니다.


      50      65      70      80      85      95


이와 같이 가장 작은 값부터 가장 큰 값까지 오름차순으로 정렬된 결과임을 알 수 있습니다. 우리가 SORT 함수를 사용하여 얻은 결과 배열인 rk를 이용하면, 사람 이름들로 구성된 배열 names에 대해서도 동일한 순서로 출력할 수 있습니다. 즉 다음과 같이 하면 됩니다.


names_sorted = names[rk]

PRINT, names_sorted


실제로 출력된 내용은 다음과 같습니다.


DD AA FF CC BB EE


이 내용은 가장 점수가 낮은 사람부터 가장 높은 사람까지의 순서에 맞게 이름 값들을 출력한 내용이 됩니다. 출력을 할 때 이왕이면 다음과 같이 해보면 어떨까요?


FOR j = 0, N_ELEMENTS(scores_sorted)-1 DO $

  PRINT, j+1, names_sorted[j], scores_sorted[j], $

  FORMAT='(I1, 2X, A2, 2X, I3)'


그러면 출력된 모습은 다음과 같이 좀 더 정돈된 형태가 되므로 보기에도 더 편할 것 같습니다.


1  DD   50

2  AA   65

3  FF   70

4  CC   80

5  BB   85

6  EE   95


만약 오름차순이 아니라 내림차순으로 결과를 얻고자 한다면 어떻게 하면 될까요? 어차피 SORT 함수의 결과는 무조건 오름차순의 형태로 산출됩니다. 따라서 내림차순의 결과를 얻고자 한다면 그 순서를 뒤집으면 됩니다. 즉 위의 내용에서 SORT 함수를 사용하여 rk를 얻은 부분만 다음과 같은 내용으로 대체하면 됩니다.


rk = REVERSE(SORT(scores))


여기서는 SORT 함수로 얻어진 결과에 대하여 REVERSE 함수를 바로 적용하여 순서를 뒤집은 것입니다. 이 상태로 나머지 내용을 실행한다면 최종적으로 다음과 같이 내림차순으로 정렬된 결과가 출력될 것입니다.


1  EE   95

2  BB   85

3  CC   80

4  FF   70

5  AA   65

6  DD   50


지금까지 SORT 함수를 이용하여 배열 내 값들을 올림차순 및 내림차순으로 정렬한 결과를 얻는 방법을 예제와 함께 살펴보았습니다. 소팅은 배열 처리에서 꽤 자주 사용되는 기능이기 때문에 그 방법을 잘 알아두시길 권장합니다.

반응형