2 minute read

17615번 : 볼 모으기

문제 링크

https://www.acmicpc.net/problem/17615

문제 설명

빨간색 볼과 파란색 볼이 <그림 1>에서 보인 것처럼 일직선상에 섞여 놓여 있을 때, 볼을 옮겨서 같은 색 볼끼리 인접하게 놓이도록 하려고 한다. 볼을 옮기는 규칙은 다음과 같다.

바로 옆에 다른 색깔의 볼이 있으면 그 볼을 모두 뛰어 넘어 옮길 수 있다. 즉, 빨간색 볼은 옆에 있는 파란색 볼 무더기를 한 번에 뛰어 넘어 옮길 수 있다. 유사하게, 파란색 볼은 옆에 있는 빨간색 볼 무더기를 한 번에 뛰어 넘어 옮길 수 있다. 옮길 수 있는 볼의 색깔은 한 가지이다. 즉, 빨간색 볼을 처음에 옮겼으면 다음에도 빨간색 볼만 옮길 수 있다. 유사하게, 파란색 볼을 처음에 옮겼으면 다음에도 파란색 볼만 옮길 수 있다. 예를 들어, 처음에 볼이 <그림 1>에서 보인 것처럼 있을 때, 빨간 볼을 <그림 2>에서 보인 것처럼 옮긴 후, <그림 3>에서 보인 것처럼 옮긴다면 두 번 만에 같은 색끼리 모을 수 있다.

그림1

<그림 1>

그림2

<그림 2>

그림3

<그림 3>

반면에 파란색 볼을 선택하여 에서 보인 것처럼 옮기면(화살표에 있는 수는 옮기는 순서를 나타낸다) 네 번을 옮겨야 같은 색의 볼끼리 모을 수 있다.

그림4

<그림 4>

일직선상에 놓여 있는 볼에 관한 정보가 주어질 때, 규칙에 따라 볼을 이동하여 같은 색끼리 모으되 최소 이동횟수를 찾는 프로그램을 작성하시오.

입력

첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주어질 수도 있으며, 이 경우 답은 0이 된다.

출력

최소 이동횟수를 출력한다.

문제 풀이

기본적으로 양쪽 끝단에 있는 연속된 공은 움직일 필요가 없으니 움직이는 횟수에서 제외한다.

아래 순서대로 정렬할 때 가장 적은 이동 횟수를 출력하면 된다.

  1. R을 왼쪽으로 옮겨 정렬
  2. B를 왼쪽으로 옮겨 정렬
  3. R을 오른쪽으로 옮겨 정렬
  4. B를 오른쪽으로 옮겨 정렬
N = int(input())
balls = input()

# 색깔발 공의 개수 저장
B_cnt = balls.count('B')
R_cnt = balls.count('R')
result = N

cnt = 0
for i in range(0, N) :
    if balls[i] == 'R' :
        cnt += 1 
    else : 
        break
result = min(result, R_cnt - cnt)
    
cnt = 0
for i in range(0, N) :
    if balls[i] == 'B' :
         cnt += 1 
    else : 
        break
result = min(result, B_cnt - cnt)
    
cnt = 0
for i in range(N-1, 0, -1) :
    if balls[i] == 'R' :
         cnt += 1 
    else : 
        break
result = min(result, R_cnt - cnt)

cnt = 0
for i in range(N-1, 0, -1) :
    if balls[i] == 'B' :
         cnt += 1 
    else : 
        break
result = min(result, B_cnt - cnt)

print(result)

Comments