# 볼 모으기 import sys input = sys.stdin.readline def count_result(n, balls, left, right, ball_count): left_count, right_count = 0, 0 left_idx, right_idx = 0, n-1 while left_idx <= n-1 and balls[left_idx] == left: left_count += 1 left_idx += 1 while right_idx >= 0 and balls[right_idx] == right: right_count += 1 right_idx -= 1 return min(ball_count[left]-left_count, ball_count[right]-right_count) def solution(): n = int(input().rstrip()) balls = list(input().rstrip()) ball_count = {"R": 0, "B": 0} for b in balls: ball_count[b] += 1 result = min(count_result(n, balls, "R", "B", ball_count), count_result(n, balls, "B", "R", ball_count)) print(result) return solution() """ 걸린 시간: 50분 시간 복잡도: count_result가 왼쪽, 오른쪽에 대해 첫 묶음이 몇 개인지 계산하는데 최악의 경우 전체이므로, O(n)이다. 처음에 ball_count를 셀 때 O(n)이고, count_result가 2번이므로 O(3n), 전체 시간복잡도는 O(n)이다. 해설: 같은 것끼리 묶인 최종 상태는 한쪽 끝이 B, R 하나씩 있어야 된다. 따라서 큰 경우의 수는 양 끝이 R, B 이거나 B, R인 경우이다. 이제 각 경우의 수마다 R을 넘길지 B를 넘길지 계산하면 되는데, 정해진 경우의 끝에 따라서 같은 묶음만 뺀 개수를 세면 된다. 경우의 수 1) R, B일때 왼쪽 R 묶음 제거한 R 개수, 오른쪽 B 묶음 제거한 B개수 중 최소 경우의 수 2) B, R일때 왼쪽 B 묶음 제거한 B 개수, 오른쪽 R 묶음 제거한 R개수 중 최소 두 경우의 수 중 최소 값 구하면 된다. """