그리디 - 17615번: 볼 모으기

jisu_log·2025년 6월 6일

알고리즘 문제풀이

목록 보기
37/105

경우의 수는 총 4가지만 존재함

1) 레드를 모두 왼쪽으로 옮기기
2) 레드를 모두 오른쪽으로 옮기기
3) 블루를 모두 왼쪽으로 옮기기
4) 블루를 모두 오른쪽으로 옮기기
또한, 각 경우의 이동 횟수는 (현재 컬러의 전체 갯수) - (현재 컬러의 현재 방향의 끝에 존재하는 현재 컬러 덩어리 갯수) 로 계산할 수 있음

n = int(input())
str = input()


min_move = 999999

colors = ['R', 'B']

# 경우의 수: R을 왼쪽으로 모두 옮기기, R을 오른쪽으로, B를 왼쪽으로, B를 오른쪽으로

# R, B 순으로 반복
for i in range(2):
    # 1) 해당 컬러를 왼쪽으로 옮기기
    if str[0] == colors[i]: # 맨 왼쪽이 해당 컬러라면
        # 맨 왼쪽 해당 컬러 덩어리 카운트
        r_count = 1
        idx = 1

        # 인덱스 범위 주의!
        while 0 <= idx < n and str[idx] == colors[i]:
            r_count += 1
            idx += 1
        
        move = str.count(colors[i]) - r_count
        
        min_move = min(min_move, move)
        
    else: # 맨 왼쪽이 해당 컬러가 아니라면
        move = str.count(colors[i])
        min_move = min(min_move, move)

    # 2) 해당 컬러를 오른쪽으로 옮기기
    if str[n - 1] == colors[i]: # 맨 오른쪽이 해당 컬러라면
        # 맨 오른쪽 해당 컬러 덩어리 카운트
        r_count = 1
        idx = n - 2

        # 인덱스 범위 체크
        while 0 <= idx < n and str[idx] == colors[i]:
            r_count += 1
            idx -= 1
        
        move = str.count(colors[i]) - r_count
        
        min_move = min(min_move, move)
        
    else: # 맨 오른쪽이 해당 컬러가 아니라면
        move = str.count(colors[i])
        min_move = min(min_move, move)

print(min_move)

0개의 댓글