17615-s1 성공

This commit is contained in:
2026-02-16 18:41:21 +09:00
parent f6df1e7883
commit 54307abd2a

51
workbook_8708/17615-s1.py Normal file
View File

@@ -0,0 +1,51 @@
# 볼 모으기
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개수 중 최소
두 경우의 수 중 최소 값 구하면 된다.
"""