첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주어질 수도 있으며, 이 경우 답은 0이 된다.
출력
최소 이동횟수를 출력한다.
입력 예시
9
RBBBRBRRR
출력 예시
2
풀이
각 공을 기준으로 옮기는 경우를 생각하자. 옮긴 후에는 "R...RB..B"꼴 혹은 "B...BR..R"꼴과 같이 같은 색상들이 한 곳으로 모여 있어야 한다.
첫 단(ball[0]), 혹은 끝 단(ball[-1])에 해당 공이 위치하는 경우 그 공의 위치로 남은 공을 옮기는 게 가장 좋은 선택이다. 이 때 총 공의 개수가 m, 양 끝단에 연속하는 공의 개수가 n이라면 옮기는 횟수는 m-n이 된다.
만약 위에 해당하지 않는다면, 모든 공을 한쪽 끝단으로 옮기는 경우밖에 존재하지 않는다. 따라서 옮기는 횟수는 m이 된다.
빨간 공과 파란 공 각각에 그리디하게 이를 적용하면 빠르게 풀이할 수 있다.
풀이 코드
import sys
input = sys.stdin.readline
N = int(input())
balls = input().strip()
ball_cnt = {'R' : 0, 'B' : 0}
for ball in balls :
ball_cnt[ball] += 1
ans = float('inf')
for b in ['R', 'B'] :
flg = True
for _balls in [balls, balls[::-1]] :
if _balls[0] != b :
continue
cnt = 1
flg = False
for _b in _balls[1:] :
if _b != b :
break
cnt += 1
ans = min(ans, ball_cnt[b] - cnt)
if flg :
ans = min(ans, ball_cnt[b])
print(ans)