본문 바로가기

백준/실버

[백준 17615번] 볼 모으기 (C++)

문제링크 : https://www.acmicpc.net/problem/17615

 

17615번: 볼 모으기

첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>

int main()
{
    int N,R_cnt=0,B_cnt=0;
    string s;

    cin>>N>>s;
    for(int i=0; i<s.size(); i++)
    {
        if(s[i]=='R')R_cnt++;
        else B_cnt++;
    }
    
    int cnt1=0, cnt2=0, cnt3=0, cnt4=0, idx=0;

    while(s[idx++]=='R'){cnt1++;} //좌측에 R 모으기

    idx=N-1;
    while(s[idx--]=='R'){cnt2++;} //우측에 R 모으기

    idx=0;
    while(s[idx++]=='B'){cnt3++;} //좌측에 B 모으기

    idx=N-1;
    while(s[idx--]=='B'){cnt4++;} //우측에 B 모으기

    cout<<min({R_cnt-cnt1, R_cnt-cnt2, B_cnt-cnt3, B_cnt-cnt4});
}

경우의 수가 이렇게 총 4가지이다.

좌측에 R 모으기 / 우측에 R 모으기

좌측에 B 모으기 / 우측에 B 모으기

 

탐색 시작위치를 배열의 가장 왼쪽과 가장 오른쪽 이렇게 2군데를 잡는다.

각각에 위치에서 탐색할때 현재 값을 카운팅하다가 현재 값과 다른 값이 나온다면 카운팅을 멈추고 총 갯수에서 카운팅된 수를 빼면 넘겨야 할 수가 나온다.