Algorithm (PS)
백준 17615번: 볼 모으기 (Python/파이썬) - Greedy
minjiwoo
2022. 12. 25. 14:06
728x90
https://www.acmicpc.net/problem/17615
17615번: 볼 모으기
첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주
www.acmicpc.net
1) 15% 맞았습니다 달성..
ㅠㅠ
import sys
input = sys.stdin.readline
n = int(input())
array = input()
answer = 0
r_move = 0
b_move = 0
r_end = 0
b_end = 0
# 맨 오른쪽의 알파벳 개수 카운트
for i in range(n-1, -1, -1):
if array[i] == 'R':
r_end += 1
if array[i-1] != 'R':
break
else:
b_end += 1
if array[i-1] != 'B':
break
for i in range(n):
if array[i] == 'R':
r_move += 1
else: # B
b_move += 1
if r_move == n or b_move == n:
print(answer) # 이동 횟수 0
else:
answer = min(r_move-r_end, b_move-b_end)
print(answer)
2) 맨 오른쪽에 있는 볼 색깔 뿐만 아니라 맨 왼쪽에 있는 볼 색깔도 카운트 해주어야 했다 !!!!
무조건 오른쪽으로만 볼을 이동할 수 있다고 생각했는데, 그게 아니었다 ..
<정답코드>
import sys
input = sys.stdin.readline
n = int(input())
array = list(input())
r = array.count('R')
b = n - r
answer = min(r, b)
r_end = 0
b_end = 0
# 맨 오른쪽부터 연속된 볼 카운트하기
for i in range(n-1, -1, -1):
if array[i] == 'R':
r_end += 1
if array[i] != array[n-1]:
break
else:
b_end += 1
if array[i] != array[n-1]:
break
if array[n-1] == 'R':
answer = min(r - r_end, answer)
else:
answer = min(b - b_end, answer)
r_start = 0
b_start = 0
# 왼쪽에서부터 연속된 볼 카운트 하기 -> 이걸 생각못함;;
for i in range(n):
if array[i] == 'R':
r_start += 1
if array[i] != array[0]:
break
else: # B
b_start += 1
if array[i] != array[0]:
break
if array[0] == "R": # RRRR ___
answer = min(answer, r - r_start)
else:
answer = min(answer, b - b_start)
print(answer)
728x90