어흥

[백준 15831] 준표의 조약돌 (C++) 본문

알고리즘/백준

[백준 15831] 준표의 조약돌 (C++)

라이언납시오 2021. 5. 4. 18:27
728x90
반응형

문제 링크: www.acmicpc.net/problem/15831

 

15831번: 준표의 조약돌

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

www.acmicpc.net

1. 주의할 점

- 두 포인터를 사용한다

 

2. 구현

- 0번째 돌 추가 이후 While문을 수행한다

- L=R=Result=0으로 초기화하고 시작한다

- 조건에 맞게 산책이 가능할때, Result값과 비교하여 갱신한다

- 검정색 조약돌의 수가 기준치보다 적거나 같을 때, R을 오른쪽으로 한칸 더 움직인다 → incR() 함수 수행. 이때, False를 반환할 경우 While문을 종료한다

- 검정색 조약돌의 수가 기준치보다 많을 때, L을 왼쪽으로 한칸 움직인다 → incL() 함수 수행. 이때, False를 반환할 경우 R을 증가시키기 위해 incR() 함수를 수행한다. 이때도 False를 반환하면 While문을 종료한다

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int num,black,white,b=0,w=0,result=0,l=0,r=0,len;
char c;
string str;

bool incR(){
    if(r==len-1) return false;
    c = str[++r];
    if(c=='W') w++;
    else b++;
    return true;
}

bool incL(){
    if(l==r) return false;
    c = str[l++];
    if(c=='W') w--;
    else b--;
    return true;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin>>num>>black>>white;
    cin>>str;
    len = str.size();
    if(str[0]=='W') w++;
    else b++;
    while(r<len){
        if(w>=white && b<=black){
            result = max(result,r-l+1);
        }
        if(black<b){
            if(!incL())       //l==r -> r증가 or l증가
                if(!incR()) break;
        }
        else{       //b 더 추가 가능 -> r증가
            if(!incR()) break;
        }
    }
    cout<<result;
    return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2243] 사탕상자 (C++)  (0) 2021.05.12
[백준 2042] 구간 합 구하기 (C++)  (0) 2021.05.12
[백준 16472] 고냥이 (C++)  (0) 2021.04.29
[백준 14746] Closest Pair (C++)  (0) 2021.04.28
[백준 2531] 회전 초밥 (C++)  (0) 2021.04.27
Comments