티스토리 뷰
접근방식
처음에 이런 방식을 생각해 보았지만 예제 2에서 오류를 발견함.
아래 코드는 주어진 char 배열에서 R과 B의 세그먼트 (ex. RRR, BBB)같이 연속되어 있는 알파벳의 카운트만 계산해줌.
int countBall(int N, char balls[]){
int rcount = 0, bcount = 0;
char curcolor = balls[0];
if (curcolor == 'R'){
rcount += 1;
}else if (curcolor == 'B'){
bcount += 1;
}
for (int i = 1; i < N; i++){
if (balls[i] != curcolor){
curcolor = balls[i];
if (curcolor == 'R'){
rcount += 1;
}else{
bcount += 1;
}
}
}
return min(rcount, bcount);
}
이걸로는 구할 수가 없고, 먼저 R과 B의 occurence를 세준 다음
B나 R을 왼쪽으로 모는 경우와 오른쪽으로 모는 경우를 따로 나누고,
같은 알파벳이 연속해서 나오면 카운터를 늘려줘서 만약 첫 알파벳이 R이면 R에서 카운터를 빼주고 B면 B에서 카운터를 빼준다.
그걸 0에서 N 그리고 N-1부터 0 까지 반복해서 오른쪽 왼쪽의 경우를 따로 나누고, 최종적으로 최솟값을 포함한 ans 를 출력시켜준다.
코드
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int countBall(int N, string balls){
int rc = count(balls.begin(), balls.end(), 'R');
int bc = count(balls.begin(), balls.end(), 'B');
int ans = min(rc, bc);
int cnt = 0;
for (int i = 0; i < N; i ++){
if (balls[i] != balls[0]) break;
cnt++;
}
if (balls[0] == 'R'){
ans = min(ans, rc - cnt);
}else{
ans = min(ans, bc - cnt);
}
int revc = 0;
for (int i = N - 1; i >= 0; i--){
if (balls[i] != balls[N - 1]) break;
revc++;
}
if (balls[N - 1] == 'R'){
ans = min(ans, rc - revc);
}else{
ans = min(ans, bc - revc);
}
return ans;
}
int main(){
int n;
cin >> n;
string b;
cin >> b;
cout << countBall(n, b);
}
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 숫자사각형3
- 1338
- 백준
- 15650
- 24954
- 단어집합2
- 8129
- 1535
- 문자삼각형1
- 세로읽기
- 몇번째조합
- 정올
- 트리 순회
- 색종이(초)
- 볼 모으기
- 문자열찾기
- 연필공장
- 5545
- 2857
- N과M
- 색종이(중)
- 15652
- 문자사각형
- 15651
- 15654
- 볼모으기
- 3427
- 2604
- 1438
- 1304
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함