문제
알고리즘
- 레드와 블루가 오른쪽과 왼쪽으로 모으는 경우를 생각해서 문제를 수행한다.
- 모을 때 뭉텅이가 생기는 경우는 이사 온 볼을 제외한 그다음 볼만으로 모으면 된다.
=> 그다음 볼들이 있다면 그다음 볼들이 먼저 이동한 후에 첫 번째 볼이 이동하는 것이 최소 횟수이므로.
코드
import sys
n = int(sys.stdin.readline())
m = list(map(str, sys.stdin.readline().strip()))
answer = []
blue = 0
red = 0
cnt = 0
# 우측으로 레드 보내기
for i in range(n):
if m[i] == "R":
red += 1
if m[i] == "B" and red:
cnt += red
red = 0
answer.append(cnt)
# 우측으로 블루 보내기
cnt = 0
for i in range(n):
if m[i] == "B":
blue += 1
if m[i] == "R" and blue:
cnt += blue
blue = 0
answer.append(cnt)
# 좌측으로 레드 보내기
m.reverse()
cnt = 0
red = 0
for i in range(n):
if m[i] == "R":
red += 1
if m[i] == "B" and red:
cnt += red
red = 0
answer.append(cnt)
# 좌측으로 블루 보내기
blue = 0
cnt = 0
for i in range(n):
if m[i] == "B":
blue += 1
if m[i] == "R" and blue:
cnt += blue
blue = 0
answer.append(cnt)
print(min(answer))
다른 사람 정답 코드(코드가 짧다..)
import sys
N = int(sys.stdin.readline().strip())
balls = str(sys.stdin.readline().strip())
cnt = []
# 우측으로 레드 모으기
rexplore = balls.rstrip('R')
cnt.append(rexplore.count('R'))
# 우측으로 블루 모으기
rexplore = balls.rstrip('B')
cnt.append(rexplore.count('B'))
# 좌측으로 레드 모으기
lexplore = balls.lstrip('R')
cnt.append(lexplore.count('R'))
# 좌측으로 블루 모으기
lexplore = balls.lstrip('B')
cnt.append(lexplore.count('B'))
print(min(cnt))
strip을 통해 오른쪽, 왼쪽에 있는 뭉텅이를 제외하고 각 볼의 색을 카운트한다.
각 볼의 색을 카운트하는 이유는 위에서 설명한 뭉텅이를 제외한 알고리즘과 똑같다.
github
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 16198번(파이썬): 에너지 모으기 (0) | 2022.04.21 |
---|---|
[baekjoon] 백준 13335번(파이썬): 트럭 (0) | 2022.04.20 |
[baekjoon] 백준 21758번(파이썬): 꿀 따기 (0) | 2022.04.18 |
[baekjoon] 백준 2841번(파이썬): 외계인의 기타 연주 (0) | 2022.04.17 |
[baekjoon] 백준 1448번(파이썬): 삼각형 만들기 (0) | 2022.04.16 |