[BOJ] 백준 15831 준표의 조약돌
문제 링크 : https://www.acmicpc.net/problem/15831
다른 스택/큐 문제들과 마찬가지로 원하는 조건 밖의 문제가 생겼을 경우
그 문제가 생긴 부분까지 없애준 후 다시 시작하면 되는 문제 입니다.
즉, 검은돌이 최대 1개까지만 있어야 한다면
BWWBW 의 경우 두번째 B가 나오는 4번째 직전까지의 돌들은 없애준 후 4번째 돌(B)부터
다시 세면 됩니다.
소스 코드 :
#include#include #include using namespace std; int main() { int n, b, w; cin >> n >> b >> w; cin.ignore(); queue q; string s; getline(cin, s); int bc = 0, wc = 0; int number = 0; for (int i = 0; i < n; i++) { // 현재 돌이 검은색/흰색일 경우 count를 올려준다. if (s[i] == 'B') bc++; else wc++; // 수용가능한 검은 돌의 숫자를 넘었을 경우 if (bc > b) { // 흰돌은 그냥 pop 하고, 검은돌의 경우, 그 검은돌 뒤에 흰돌이 있을 수 있으므로 // 큐의 크기가 1이 아니라면 pop 후 break로 탈출해야 그 검은돌만 pop 할 수 있다. while (!q.empty()) { if (q.front() == 'W') wc--; else { bc--; if (q.size() != 1) { q.pop(); break; } } q.pop(); } } // 큐에 현재 검사 완료한 돌 push q.push(s[i]); // 큐가 비어있었는데, 지금 들어온 돌이 수용가능한 검은돌을 넘었을경우 if (bc > b) { q.pop(); bc--; } // 필요한 흰돌의 개수를 넘었을 경우 number에 길의 길이 기록. if (wc >= w) { number = number > q.size() ? number : q.size(); } } cout << number << endl; }
댓글
댓글 쓰기