[백준/BOJ] 백준 15831번 : 준표의 조약돌

2022. 2. 5. 17:09알고리즘 문제풀이

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

 

15831번: 준표의 조약돌

첫 줄에 조약돌의 총 개수 N, 준표가 원하는 검은 조약돌의 최대개수 B와 하얀 조약돌의 최소개수 W가 주어진다. 둘째 줄에는 N개의 조약돌의 정보가 한 줄로 주어진다. i번째 문자가 B라면 i번 조

www.acmicpc.net

투 포인터를 이용하여 두 개의 돌의 조건을 확인해서 문제를 해결했다

 

코드

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

int n, b, w;
string stone;

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

	cin >> n >> b >> w;
	cin >> stone;

	int left = 0;
	int right = 0;
	int b_sum = 0;
	int w_sum = 0;
	int result = 0;

	while (1)
	{
		if (b_sum <= b && w_sum >= w)
			result = max(result, right - left);

		if (right >= n)
			break;

		if (stone[right] == 'B')
		{
			//right를 주우면 b값 초과가 될때
			if (b_sum + 1 > b)
			{
				//right를 줍지 않고 left를 옮긴다

				if (stone[left] == 'B')
					b_sum--;

				else
					w_sum--;

				left++;
			}

			//right를 주워도 b값 이하일때
			else
			{
				b_sum++;

				right++;
			}

		}

		else
		{
			w_sum++;

			right++;
		}
	}

	cout << result;

	return 0;
}