https://www.acmicpc.net/problem/5525
5525번: IOIOI
N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 PN이라고 한다. P1 IOI P2 IOIOI P3 IOIOIOI PN IOIOI...OI (O가 N개) I와 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 PN이 몇
www.acmicpc.net
우선 문제부터 요약하면,
I와 O로만 이루어진 문자열이 주어질 때, 해당 문자열에서 IOI가 반복되는 패턴을 반복수에 따라 P1, P2등으로 정의할 때, PN이 주어진 문자열에서 몇번 등장하는지 카운팅을 하는 문제입니다.
<Solution>
일단 문자열의 길이가 100만개 까지 가능하기 때문에 O(N)이나 O(NlogN) 정도 까지의 복잡도만 사용이 가능합니다.
그래서 IOI패턴이 등장하게 되면 IOI패턴이 총 몇번 반복되는 지를 통해 PN의 반복수를 결정하는 방식으로 시간 복잡도를 O(3*N)정도로 문제를 해결할 수 있습니다.
간단하게 예시로 살펴보자면,
N=2 인 상황에서
IOIOIOI가 등장했다고 칩시다. 그러면 이 과정에서 IOI가 총 3번 반복되는 것을 알 수 있습니다. N=2 즉 IOIOI 패턴은 여기에 2번 등장합니다. IOIOIOI IOIOIOI
이렇게 2번 등장한다는 사실을 3-N+1을 통해 계산할 수 있습니다. (연속된 IOI의 갯수 - N + 1)
만약 이 값이 음수가 된다면 우리가 찾고자 하는 패턴보다 모자란 갯수의 연속된 IOI가 등장한 것이므로 음수가 아닌 0으로 처리해 주는 부분만 조심하면 됩니다.
실제 구현은 아래와 같습니다.
#include <iostream>
using namespace std;
int N;
int M;
char S[1000000+10];
void getinput(){
cin >> N >> M >> S;
}
int solution(){
int ret = 0;
int consecutive = 0;
for(int i = 0; i<M-2; i++){
if(S[i] == 'I' && S[i+1] == 'O' && S[i+2] == 'I'){
consecutive++;
i++;
}
else{
ret += (consecutive-N+1 >0) ? consecutive-N+1 : 0;
consecutive = 0;
continue;
}
}
ret += (consecutive-N+1 >0) ? consecutive-N+1 : 0;
return ret;
}
int main(){
getinput();
int ans = solution();
cout << ans << endl;
return 0;
}
'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글
[백준] 녹색 옷 입은 애가 젤다지? (0) | 2023.02.05 |
---|---|
[백준] 알고스팟 (0) | 2023.02.05 |
[백준] Σ (0) | 2023.01.22 |
[백준] 파이프 옮기기 1 (0) | 2023.01.22 |
[LeetCode] Construct Binary Tree from Preorder and Inorder Traversal (0) | 2023.01.01 |