Post List

[BOJ] 백준 15831 준표의 조약돌

[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;

}

댓글