diff --git a/workbook_8708/17615-s1.py b/workbook_8708/17615-s1.py new file mode 100644 index 0000000..5212d65 --- /dev/null +++ b/workbook_8708/17615-s1.py @@ -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개수 중 최소 +두 경우의 수 중 최소 값 구하면 된다. +""" \ No newline at end of file