-
볼 모으기 - 17615Algorithm/BOJ 2020. 7. 19. 19:29123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051//17615 - 볼 모으기#include <iostream>using namespace std;int N;int Redn, Blun;int ln, rn;char lc, rc;int main(){ios_base::sync_with_stdio(0);cin.tie(0);cin >> N;string s;cin >> s;for (int i = 0; i < N; ++i)if (s[i] == 'R')++Redn;else++Blun;char h = s[0];int cnt = 1;for(int i = 1; i<N; ++i)if(h == s[i]) ++cnt;else break;if(h == 'R') ln = cnt, lc = 'R';else ln = cnt, lc = 'B';h = s[N-1];cnt = 1;for(int i = N-2; i>=0; --i)if(h == s[i]) ++cnt;else break;if(h == 'R') rn = cnt, rc = 'R';else rn = cnt, rc = 'B';int ans = 1000000;if(lc == 'R' && rc == 'R')ans = min(Blun, min(Redn - ln, Redn - rn));else if(lc == 'R')ans = min(Redn - ln, Blun - rn);else if(rc == 'R')ans = min(Redn - rn, Blun - ln);elseans = min(Redn, min(Blun - ln, Blun - rn));cout << ans;}
cs https://www.acmicpc.net/problem/17615
17615번: 볼 모으기
첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주��
www.acmicpc.net
볼 모으기
어느 한 색의 공을 왼쪽이나 오른쪽으로 몰게 될떄 최소 이동 횟수를 구하면 됩니다.
즉 이동시킬 색의 공의 개수에서 해당공이 맨 왼쪽부터 연속적으로 몰려있다면 왼쪽에 몰려있는 공의 개수를 빼면 해당 색의 공을 왼쪽으로 몰게 되는것이고, 오른쪽인 경우도 마찬가지입니다.
추가로 이동시킬려는 색의 공이 맨 왼쪽, 맨 오른족 어느 쪽에도 존재하지 않는 경우라면 이동시킬려는 색깔의 공 개수 만큼 이동시켜야 됩니다.
위의 모든 경우를 따져 보았을때 최소가 되는 이동횟수가 정답입니다.
'Algorithm > BOJ' 카테고리의 다른 글
KOI 2019 중등부 2차 / 신기한 수 - 17618 (0) 2020.07.28 등수 찾기 - 17616 (0) 2020.07.19 369 - 17614 (0) 2020.07.19 비트베리 - 17374 (0) 2020.07.13 사탕 줍는 로봇 - 15892 (0) 2020.07.06