득이공간

[백준 C++] 5525 IOIOI - 문자열 본문

PS/알고리즘 문제풀이

[백준 C++] 5525 IOIOI - 문자열

쟁득 2024. 2. 16. 11:38
 

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

#include <iostream>
#include <string>
using namespace std;

string S;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int N, M;
	cin >> N >> M >> S;

	int Count = 0;
	for (int i = 0; i < M; ++i)
	{
		int K = 0;

		if (S[i] == 'O')
		{
			continue;
		}

		while (S[i + 1] == 'O' && S[i + 2] == 'I')
		{
			++K;

			if (K == N)
			{
				--K;
				++Count;
			}

			i += 2;
		}
	}

	cout << Count;
}

 

입력 받은 s 문자열에서 0번 인덱스부터 순차 탐색을 진행해서 푸는 문제입니다.

풀이 과정은 다음과 같습니다.

 

1. 'I'를 발견할 때까지 인덱스를 1씩 증가

2. 현재 인덱스의 문자가 'I'일 때: 한 칸 뒤, 두 칸 뒤의 문자의 합이 "OI"면 K + 1, "OI"가 아니면 1번부터 다시 시작

3. 인덱스를 2씩 늘려가며 "OI" 체크 및 K값 증가 반복

4. K값이 N과 같아졌을 때 Count + 1, K - 1(다음 문자열 체크를 위함)

5. 문자열을 모두 탐색할 때까지 1~5 반복