51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
# 볼 모으기
|
|
|
|
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개수 중 최소
|
|
두 경우의 수 중 최소 값 구하면 된다.
|
|
""" |