https://www.acmicpc.net/problem/15831
#문제 간단 정리
투 포인터 /슬라이딩 윈도우 문제
계속해서 조약돌을 줍다가 검은 조약돌이 초과하게 되면
슬라이딩 윈도우를 줄여주면 된다.
#문제 해결 방법
슬라이딩 윈도우를 사용한다고 생각하고
우선 기본적으로 ㅣ , r 두가지의 포인터를 설정하고
오른쪽으로 계속 조약돌을 r++ 하면서 주워주되
while (r < n) {
bw[color_map[s[r]]]++;
r++;
while (bw[0] > b ) {
bw[color_map[s[l]]]--;
l++;
}
if (bw[0] <= b && bw[1] >= w) {
maxlength = max(maxlength, r - l);
}
}
만약 검은 조약돌의 개수가 원하는 개수보다 늘어나개 된다면
검은 조약돌이 원하는 개수 이하가 되도록 왼쪽포인터를 l++ 해서
while (bw[0] > b ) {
bw[color_map[s[l]]]--;
l++;
}
윈도우 사이즈를 줄여주도록 하자
#전체 코드
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
int main() {
int n;
cin >> n;
int b, w;
cin >> b >> w;
string s;
cin >> s;
int bw[2] = { 0,0 }; //0은 검정 1은 흰색
map<char, int>color_map;
color_map['W'] = 1;
color_map['B'] = 0;
int l = 0, r = 0;
int maxlength = 0;
while (r < n) {
bw[color_map[s[r]]]++;
r++;
while (bw[0] > b ) {
bw[color_map[s[l]]]--;
l++;
}
if (bw[0] <= b && bw[1] >= w) {
maxlength = max(maxlength, r - l);
}
}
cout << maxlength << '\n';
return 0;
}
'[백준] > C++' 카테고리의 다른 글
백준 1213번 펠린드롬 만들기 [C++] (0) | 2024.07.05 |
---|---|
백준 31718번 Double Up [C++] (0) | 2024.07.04 |
백준 2312번 수 복원하기 [C++] (0) | 2024.06.26 |
백준 11721번 열 개씩 끊어 출력하기 [C++] (0) | 2024.06.19 |
백준 1786번 찾기 [C++] (0) | 2024.06.18 |