반응형
백준 1522번: 문자열 교환, CPP C++ 답안, 백준 코딩테스트 C++ CPP 풀이
문제
a와 b로만 이루어진 문자열이 주어질 때, a를 모두 연속으로 만들기 위해서 필요한 교환의 회수를 최소로 하는 프로그램을 작성하시오.
이 문자열은 원형이기 때문에, 처음과 끝은 서로 인접해 있는 것이다.
예를 들어, aabbaaabaaba이 주어졌을 때, 2번의 교환이면 a를 모두 연속으로 만들 수 있다.
입력
첫째 줄에 문자열이 주어진다. 문자열의 길이는 최대 1,000이다.
출력
첫째 줄에 필요한 교환의 회수의 최솟값을 출력한다.
답안
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int minSwapsToGroupA(const string& s) {
int n = s.length();
int a_count = count(s.begin(), s.end(), 'a');
if (a_count == 0 || a_count == n) {
return 0;
}
string doubled_s = s + s;
int min_swaps = n;
int current_b_count = 0;
for (int i = 0; i < a_count; ++i) {
if (doubled_s[i] == 'b') {
current_b_count++;
}
}
min_swaps = current_b_count;
for (int i = a_count; i < 2 * n; ++i) {
if (doubled_s[i] == 'b') {
current_b_count++;
}
if (doubled_s[i - a_count] == 'b') {
current_b_count--;
}
min_swaps = min(min_swaps, current_b_count);
}
return min_swaps;
}
int main() {
string s;
cin >> s;
cout << minSwapsToGroupA(s) << endl;
return 0;
}
반응형
'공부 > 코딩테스트' 카테고리의 다른 글
백준 1900번: 레슬러. CPP C++ 답안, 백준 코딩테스트 C++ CPP 풀이 (0) | 2024.06.22 |
---|---|
백준 1821번: 수들의 합 6. CPP C++ 답안, 백준 코딩테스트 C++ CPP 풀이 (0) | 2024.06.22 |
백준 1446번: 지름길 C++ CPP 답안, 백준 코딩테스트 CPP 풀이 (0) | 2024.06.22 |
백준 1455번: 뒤집기 II Python 파이썬 답안, 백준 코딩테스트 파이썬 풀이 (0) | 2024.06.22 |
백준 1389번: 케빈 베이컨의 6단계 법칙 Python 파이썬 답안, 백준 코딩테스트 파이썬 풀이 (0) | 2024.06.22 |
댓글