17615号
6770 ワード
質問する
赤いボールと青いボールが『図1』に示すように一直線に混ざっていると、同じ色のボールが隣接して置かれるようにボールを動かしたい.ボールを動かすルールは以下の通りです.
逆に、青いボールを選択して、で見たように移動(矢印の数字は移動の順序を表す)すると、同じ色のボールの間に集まるには4回移動する必要があります.
直線上のボールについての情報が与えられたら、ルールに従ってボールを移動し、同じ色の間に集まり、最小の移動回数を検索するプログラムを作成します.
入力
1列目はボールの総数Nを与える.(1≦N≦500000)次の行にはスペースがなく、球の色を表す文字R(赤い球)またはB(青い球)である.文字列は、RまたはBのいずれかのみを与えることができ、この場合、答えは0である.
しゅつりょく
最小移動回数を出力します.
N = int(input())
S = input()
# 빨간색 count 저장
red = S.count('R')
# 파란색 count 저장
blue = N - red
# 빨강, 파랑 중 더 개수가 적은 것 저장
ans = min(red, blue)
cnt = 0
#반복문 돌면서, 연속적인 것 count
for i in range(N):
if S[i] != S[0]:
break
cnt += 1
# 만약에 연속 count한게 빨간색이었다면, 위의 답 vs <전체 빨강 개수 - 앞에서부터 연속 빨강 개수> 중 적은 것 저장
if S[0] == 'R':
ans = min(ans, red - cnt)
# 만약에 연속 count한게 빨간색이었다면, 위의 답- <전체 파랑 개수 - 앞에서부터 연속 파랑 개수> 중 적은 것 저장
else:
ans = min(ans, blue - cnt)
cnt = 0
# 반복문 거꾸로 돌면서 끝에서 얼마나 연속되는지 저장
for i in range(N-1, -1, -1):
if S[i] != S[N - 1]:
break
cnt += 1
#만약 연속 count했던게 빨강이었다면, 위의 값 vs <전체 빨강 개수 - 뒤에서부터 연속 빨강 개수>
if S[N - 1] == 'R':
ans = min(ans, red - cnt)
#만약 연속 count했던게 파랑이었다면, 위의 값 vs <전체 파랑 개수 - 뒤에서부터 연속 파랑 개수>
else:
ans = min(ans, blue - cnt)
print(ans)
# 최소값을 구하기 위해서 계속해서 mid으로 답을 갱신해나간다.
優先度
Reference
この問題について(17615号), 我々は、より多くの情報をここで見つけました https://velog.io/@a87380/17615번-볼-모으기-파이썬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol