문자열 교환

박고은·2025년 1월 22일
0

코딩테스트 연습

목록 보기
35/37

문제 ✨

1522번: 문자열 교환

a와 b로만 이루어진 문자열이 주어질 때, a를 모두 연속으로 만들기 위해서 필요한 교환의 회수를 최소로 하는 프로그램을 작성하시오.

이 문자열은 원형이기 때문에, 처음과 끝은 서로 인접해 있는 것이다.

예를 들어, aabbaaabaaba이 주어졌을 때, 2번의 교환이면 a를 모두 연속으로 만들 수 있다.

첫번째 풀이

s = input()

a_cnt = s.count('a')
b_cnt = len(s)

total = len(s)

for i in range(total):
    if a_cnt <= total-i:
        cnt = s[i:i+a_cnt].count('b')
    else:
        cnt = s[i:].count('b') + s[:a_cnt-(total-i)].count('b')
    if b_cnt > cnt: b_cnt = cnt

print(b_cnt)

두번째 풀이

s = input()

a_cnt = s.count('a')
b_cnt = len(s)

s2 = s*2

for i in range(len(s2)):
    if i+a_cnt > len(s2)-1: break
    else:
        cnt = s2[i:i+a_cnt].count('b')
        if b_cnt > cnt: b_cnt = cnt

print(b_cnt)

원형 문자열 처리: 슬라이딩 윈도우

a의 총 개수만큼 슬라이싱한 구간에서 b의 개수

나머지 구간에서의 a와 슬라이싱된 구간의 b 교환
b -> a 교환이 최소로 이루어지는 구간을 찾는 방식

0개의 댓글