PS
[C++] 건공문자열 (백준 30823번)
jungh150c
2025. 4. 6. 14:33

https://www.acmicpc.net/problem/30823

처음에는 그냥 진짜 문제 지문 그대로 구현했더니 시간 초과를 받아서 대충 이런식으로... 몇개 해보면서 규칙을 찾았다.
규칙을 정리하면 다음과 같다.
뒤의 (n - k + 1)개의 문자들을 순서를 유지하고 그대로 앞으로 나온다.
앞의 (k - 1)개의 문자들은 뒤로 가는데, 이 순서는 주의가 필요하다. n + k가 홀수면 순서를 유지하고 그대로 붙고, 짝수면 뒤집힌 순서로 붙는다.
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, k;
cin >> n >> k;
string s;
cin >> s;
string ans;
ans.resize(n);
if ((n + k) % 2 == 1) {
for (int i = 0; i < k - 1; i++) {
ans[n - k + 1 + i] = s[i];
}
} else {
for (int i = 0; i < k - 1; i++) {
ans[n - i - 1] = s[i];
}
}
for (int i = k - 1; i < n; i++) {
ans[i - k + 1] = s[i];
}
cout << ans << '\n';
}
(AC)
string ans;
ans.resize(n);
문자열 크기를 지정하고 싶으면 위와 같이 하면 된다.