문제 설명
n개의 양의 정수와 숫자 k의 배열이 주어집니다. k보다 작거나 같은 모든 숫자를 모으는 데 필요한 최소 스왑 수를 찾으십시오.
예시
입력 배열이 {1, 5, 4, 7, 2, 10}이고 k =6이면 1개의 스왑이 필요합니다. 즉, 요소 7을 2로 스왑합니다.
알고리즘
- 'k'보다 작거나 같은 모든 요소를 센다. 개수가 'cnt'라고 가정해 보겠습니다.
- 길이가 'cnt'인 창에 대해 두 포인터 기술을 사용하여 매번 이 범위의 요소가 'k'보다 큰 수를 추적합니다. 총 개수가 'outOfRange'라고 가정해 보겠습니다.
- 길이가 'cnt'인 모든 창에 대해 2단계를 반복하고 그 중에서 최소 'outOfRange' 개수를 취합니다. 이것이 최종 답변이 될 것입니다.
예시
#include <bits/stdc++.h> using namespace std; int getMinSwaps(int *arr, int n, int k) { int cnt = 0; for (int i = 0; i < n; ++i) { if (arr[i] <= k) { ++cnt; } } int outOfRange = 0; for (int i = 0; i < cnt; ++i) { if (arr[i] > k) { ++outOfRange; } } int result = outOfRange; for (int i = 0, j = cnt; j < n; ++i, ++j) { if (arr[i] > k) { --outOfRange; } if (arr[j] > k) { ++outOfRange; } result = min(result, outOfRange); } return result; } int main() { int arr[] = {1, 5, 4, 7, 2, 10}; int n = sizeof(arr) / sizeof(arr[0]); int k = 6; cout << "Minimum swaps = " << getMinSwaps(arr, n, k) << endl; return 0; }
위의 프로그램을 컴파일하고 실행할 때. 다음 출력을 생성합니다 -
출력
Minimum swaps = 1