※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 23921번 문제인 Kick_Start이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/23921
주어진 문자열을 앞부터 차례대로 읽어나가면서, 지금의 문자를 읽었을 때 "START"문자열이 완성되었는지 확인하는 것은 어렵지 않다. 이 때, 이 "START"로 문자열이 완성될 경우의 수는 이 시점까지 완성된 "KICK"의 수와 같음을 관찰하자. 또한 "START"와 "KICK"의 마지막 문자가 서로 다르므로 두 문자열이 동시에 완성되는 경우는 없음을 관찰하자.
위의 관찰을 이용하면, 문자열을 앞부터 읽어나가면서 "START"가 등장할 때마다 지금까지 등장한 "KICK" 부분문자열의 개수를 더하는 것을 반복하는 것으로 문제를 해결할 수 있음을 알 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
int N;
string s;
void solve() {
cin >> s; N = s.length();
ll ans = 0, kcnt = 0;
for (int i = 0; i < N; i++) {
if (i > 3 && s.substr(i - 4, 5) == "START") ans += kcnt;
else if (i > 2 && s.substr(i - 3, 4) == "KICK") kcnt++;
}
cout << ans << '\n';
}
int T;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> T;
for (int t = 1; t <= T; t++) {
cout << "Case #" << t << ": ";
solve();
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17225 // C++] 세훈이의 선물가게 (0) | 2024.06.12 |
---|---|
[BOJ 30847 // C++] Нечетный ним (1) | 2024.06.11 |
[BOJ 17951 // C++] 흩날리는 시험지 속에서 내 평점이 느껴진거야 (0) | 2024.06.09 |
[BOJ 1490 // C++] 자리수로 나누기 (1) | 2024.06.08 |
[BOJ 20917 // C++] 사회적 거리 두기 (0) | 2024.06.07 |