안녕지구 #developer #bompapa

소소한팁 - 원하는 개수 만큼만 정렬하기 5 (+ ID 조건)

|

최종 결과로 배열을 정렬할 때 조건이 두 가지 이상 붙을 때가 있습니다. 예를 들어서 값이 가장 큰 것부터 n개를 정렬하고 만약 값이 같으면 ID가 작은 것부터 정렬해야 할 때입니다.

보통 정렬 알고리즘에 사용될 compare 함수를 구현하고 정렬할 때 사용하는데요, 간단하게 할 수 있는 방법이 있어서 공유드립니다. 이 방법을 사용하기 위해서는 값의 ID가 값을 저장하고 있는 배열의 index와 같아야 합니다.

예를 들어서 ID 0번과 2번의 값이 5이고, ID 1번과 3번의 값이 1이고, ID 4번와 5번의 값이 8인 경우 배열은 [5, 1, 5, 1, 8, 8] 입니다. 값이 같을 때 ID가 작은 것부터 정렬하고 싶으면, 배열을 앞에서부터 순회하면서 값이 가장 큰 위치를 찾아서 별도로 저장하고 해당 위치는 다시 검색되지 않도록 더비 데이터를 넣는 방법입니다. 출력된 결과는 ID(index)입니다.

값이 큰 것부터 정렬하고 같은 경우 ID가 작은 것부터 정렬

#include <iostream>

int sample_arr[10] = { 5,1,5,1,8,8,0,6,0,1 };

int main() {

	int total_num = 10;
	int sort_num = 5;

	int result[5];
	for (int i = 0; i < sort_num; i++) {
		int max = -1;
		int max_idx = -1;
		
		// 제일 큰 값을 검색
		// 앞에서부터 순회하기 때문에 값이 같으면 id는 작은 순으로 정렬
		for (int j = 0; j < total_num; j++) {
			if (sample_arr[j] > max) {
				max = sample_arr[j];
				max_idx = j;
			}
		}
		// 다음에 다시 찾는것을 방지하기 위해서 제거
		sample_arr[max_idx] = -1;
		result[i] = max_idx;
	}

	for (int i = 0; i < sort_num; i++) {
		printf("%d ", result[i]);
	}

}

출력

4 5 7 0 2

Comments