17615-s1 성공
This commit is contained in:
51
workbook_8708/17615-s1.py
Normal file
51
workbook_8708/17615-s1.py
Normal 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개수 중 최소
|
||||
두 경우의 수 중 최소 값 구하면 된다.
|
||||
"""
|
||||
Reference in New Issue
Block a user