개인사
[G4] 백준 15831번 준표의 조약돌 C++ 본문
728x90

리뷰

https://www.acmicpc.net/problem/15831
수집한 조약돌 색 조건에 맞는 구간의 최대 길이를 구하는 문제
전역 변수
- n : 조약돌의 개수를 저장할 변수
- b : 원하는 검은 조약돌의 최대개수를 저장할 변수
- w : 원하는 하얀 조약돌의 최소개수를 저장할 변수
- s : 조약돌 정보를 저장할 변수
함수
없음
문제풀이
- n, b, w, s값을 입력 받는다.
- 변수 l, r을 0으로 초기화한다.
- 변수 cb를 s[r]이 'W'라면 0으로, 아니면 1로 초기화한다.
- 변수 cw를 s[r]이 'W'라면 1으로, 아니면 0으로 초기화한다.
- 변수 mx를 cb <= b, cw >= w조건을 만족하면 1로, 아니면 0으로 초기화한다.
- r을 전위증가한 값이 n보다 작을 경우를 조건으로 하는 while루프를 수행한다.
- 만약 s[r]이 'W'라면 cw를 증가시키고, 아니라면 cb를 증가시킨다.
- cb가 b보다 클 경우를 조건으로 하는 while루프를 수행한다.
- s[l]이 'B'라면 cb를 감소시키고, 아니라면 cw를 감소시킨다. l을 전위증가시키며 루프를 반복한다.
- 루프를 빠져나온 뒤 cb <= b, cw >= w조건을 만족하면 mx를 r-l+1과 비교하여 더 큰 값으로 저장한다.
- 모든 탐색을 마친 후 mx에 저장된 값을 출력한다.
트러블 슈팅
- n이 1, b, w가 모두 0이고, 조약돌이 "W"로 주어진 케이스에서 0을 반환하여 99%에서 WA를 받았다.
- mx의 초기값을 0이 아닌 cb, cw값을 비교해 정확하게 초기화해주어 AC를 받았다.
참고 사항
- 0 ≤ B, W, B+W ≤ N이므로 B, W가 0인 경우를 잘 체크해 주어야 한다.
정답 코드
#include<iostream>
using namespace std;
int n, b, w;
string s;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> b >> w >> s;
int l = 0, r = 0;
int cb = s[r] == 'W' ? 0 : 1;
int cw = s[r] == 'W' ? 1 : 0;
int mx = cb <= b && cw >= w ? 1 : 0;
while (++r < n) {
if (s[r] == 'W') ++cw;
else ++cb;
while (cb > b) {
if (s[l] == 'B') --cb;
else --cw;
++l;
}
if (cb <= b && cw >= w) mx = max(mx, r - l + 1);
}
cout << mx;
}728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
| [G2] 백준 2613번 숫자구슬 C++ 이분 탐색, 매개 변수 탐색 (1) | 2025.12.27 |
|---|---|
| [G4] 백준 12892번 생일 선물 C++ 투 포인터, 정렬 (0) | 2025.12.26 |
| [G3] 백준 20366번 같이 눈사람 만들래? C++ 투 포인터, 정렬 (0) | 2025.12.24 |
| [P2] 백준 14446번 Promotion Counting C++ 머지 소트 트리, 세그먼트 트리, 오일러 경로 테크닉 (1) | 2025.12.23 |
| [G3] 백준 17619번 개구리 점프 C++ 그리디 알고리즘, 정렬, 분리 집합 (0) | 2025.12.22 |
