오늘은 배열에 대한 소팅(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 함수를 이용하여 배열 내 값들을 올림차순 및 내림차순으로 정렬한 결과를 얻는 방법을 예제와 함께 살펴보았습니다. 소팅은 배열 처리에서 꽤 자주 사용되는 기능이기 때문에 그 방법을 잘 알아두시길 권장합니다.
'IDL > 배열 생성 및 처리' 카테고리의 다른 글
2차원 배열의 인덱스 체계의 이해 및 활용 [1] (0) | 2020.07.27 |
---|---|
IDL에서 배열의 생성에 관한 각종 팁들 정리 (0) | 2020.07.16 |
배열 사이의 비교 (ARRAY_EQUAL 및 기타) (0) | 2018.10.12 |
UNIQ 함수에 관하여 (0) | 2018.07.23 |
배열 생성 관련 특수 예제 (0) | 2018.02.02 |