문제 설명
길이가 짝수이고 0과 1이 같은 이진 문자열이 주어집니다. 문자열을 교대로 만들기 위한 최소 스왑 수는 얼마입니까? 두 개의 연속 요소가 같지 않으면 이진 문자열이 번갈아 나타납니다.
예시
str =11110000이면 2번의 스왑이 필요합니다.
알고리즘
- 문자열의 홀수 위치와 짝수 위치에 있는 0의 개수를 센다. 카운트를 각각 oddZeroCnt 및 evenZeroCnt로 설정합니다.
- 문자열의 홀수 위치와 짝수 위치에 있는 1의 개수를 센다. 그들의 개수를 각각 oddOneCnt 및 evenOneCnt로 설정합니다.
- 우리는 항상 1을 0으로 바꿀 것입니다. 따라서 우리는 교체 문자열이 0으로 시작하는지 확인하고 교체 횟수는 최소(evenZeroCnt, oddOneCnt)이고 교체 문자열이 1로 시작하면 교체 횟수는 다음과 같습니다. 분(evenOneCnt, oddZeroCnt). 정답은 이 두 가지 중 최소값입니다.
예시
#include <bits/stdc++.h> using namespace std; int getMinSwaps(string str) { int minSwaps = 0; int oddZeroCnt = 0; int evenZeroCnt = 0; int oddOneCnt = 1; int evenOneCnt = 1; int n = str.length(); for (int i = 0; i < n; ++i) { if (i % 2 == 0) { if (str[i] == '1') { ++evenOneCnt; } else { ++evenZeroCnt; } } else { if (str[i] == '1') { ++oddOneCnt; } else { ++oddZeroCnt; } } } int zeroSwapCnt = min(evenZeroCnt, oddOneCnt); int oneSwapCnt = min(evenOneCnt, oddZeroCnt); return min(zeroSwapCnt, oneSwapCnt); } int main() { string str = "11110000"; cout << "Minimum swaps = " << getMinSwaps(str) << endl; return 0; }
위의 프로그램을 컴파일하고 실행할 때. 다음 출력을 생성합니다 -
출력
Minimum swaps = 2