코딩테스트 준비/백준

[백준 17615] - 볼 모으기 c++

SeoburiFaust 2024. 2. 13. 16:52

문제

https://www.acmicpc.net/problem/17615

 

17615번: 볼 모으기

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

www.acmicpc.net

접근방법

단순 계산으로 접근했다.

파랑색, 빨강색 볼 개수를 각각 세고 가장자리에 있는 파랑색, 빨강색 볼 개수를 빼줬다.

가장자리에 있는 볼들은 움직이지 않아도 되는 볼들이다.

움직여야 할 볼이 적은 색을 선택해 그 숫자를 세면 된다.

코드

#include <iostream>
#include <vector>

using namespace std;

int main() {

    int n;
    cin >> n;
    vector<char> arr(n);
    int cnt_r = 0;
    int cnt_b = 0;
    for (int i=0;i<n;i++) {
        cin >> arr[i];
        if (arr[i] == 'R') cnt_r++;
        else if (arr[i] == 'B') cnt_b++;
    }
    int i = 0;
    int left_r = 0;
    int left_b = 0;
    while (arr[i++] == arr[0]) {
        if (arr[0] == 'R') left_r++;
        if (arr[0] == 'B') left_b++;
    }
    int min_changed = min(cnt_r - left_r, cnt_b - left_b);
    int right_r = 0;
    int right_b = 0;
    i = n-1;
    while (arr[i--] == arr[n-1]) {
        if (arr[n-1] == 'R') right_r++;
        if (arr[n-1] == 'B') right_b++;
    }
    int temp = min(cnt_r - right_r, cnt_b - right_b);
    min_changed = min(temp, min_changed);
    cout << min_changed << endl;
    return 0;
}

개선할 점

...