Programing/백준, 프로그래머스(C++)
[C++][백준 1522] 문자열 교환
hye3193
2025. 1. 13. 21:08
https://www.acmicpc.net/problem/1522
풀이
직접 교환을 진행하는 것보단 최소 횟수로 교환이 진행된 문자열과 비교를 통해 총 몇 번 교환해야 하는지를 알아내는 방식이 나을 것 같았다(풀고 나서 알았지만 이와 같은 방식을 슬라이딩 윈도우 알고리즘이라고 한다)
입력받은 문자열에서 a만 남긴 문자열을 만들어주고, 해당 문자열을 오른쪽으로 한 칸씩 이동시켜가며 입력받은 문자열과 일대일로 비교하며 다를 경우 count를 올려준다
문자열의 끝은 서로 연결되어 있다고 가정하기 때문에 만약 문자열의 길이를 넘어간 인덱스에 접근할 차례면 앞으로 보내준다
이런 식으로 한 칸씩 이동해 가면서 요소들을 비교하는 식으로 진행하였다
오른쪽으로 계속 이동하다 문자열의 길이를 넘어가는 경우 위와 같이 비교한다
최종적으로 가장 적은 횟수를 출력한다
제출 코드
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string str, comp = "";
cin >> str;
for(auto c : str)
if (c == 'a') comp += "a";
int minEx = 1000;
int len = str.length();
for (int i = 0; i < len; i++)
{
int count = 0;
for (int j = 0; j < comp.length(); j++)
{
int idx = (i + j >= len) ? i + j - len : i + j;
if (str[idx] != 'a') count++;
}
minEx = min(minEx, count);
}
cout << minEx;
}