Algorithem/백준 PS with code

백준 #1522 - [S1] 문자열 교환 : 투포인터

jamong5 2023. 7. 7. 11:11

(python3)

 

1522번: 문자열 교환

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

www.acmicpc.net

 

아이디어

어딘가에 a를 다 뭉쳐놔야합니다. a를 뭉쳐놓을 위치 안에 있는 b를 밖에 있는 a와 교환해주면 됩니다. 즉 보고있는 위치 안의 b의 개수를 세는 것이 교환 최소 횟수가 됩니다. a를 뭉쳐놓을 수 있는 모든 위치에 대해 위 과정을 수행합니다.

abababababa : a가 총 6개

(ababab)ababa : 괄호 안에 a를 뭉쳐넣을것. 괄호의 길이 = 6. 괄호 안의 b를 밖으로 다 빼려면 3번 교환하면 됨.

a(bababa)baba : 이렇게 가능한 괄호 위치를 모두 탐색해주면 됩니다!

파이썬 음수 인덱스를 사용해서 고리형을 구현했습니다.

 

코드

import sys
def solution(input) :
    # a의 개수 - 가장 많이 연속된 a의 개수 XXX
    # a를 어디에 뭉쳐놓을거냐 -> 그 위치에 들어있는 b를 다 제거한다.
    # 위 과정을 슬라이딩 윈도우로 처리

    # 예외 케이스
    # aaaaaa 일때
    # a
    # b (?) or bbbb (?)


    L = input().strip()
    acnt = L.count('a')
    N = len(L)
    
    cntb = L[N-acnt:].count('b')
    mincnt = 9999999

    for e in range(N) : # e : 슬라이딩윈도우 마지막
        prev_s = L[e-acnt]
        new_e = L[e]
        if prev_s == 'b' : cntb-=1
        if new_e == 'b' : cntb+=1
        mincnt = min(mincnt,cntb)
    
    print(mincnt)

input = sys.stdin.readline
solution(input)

 

my solved.ac :

 

solved.ac

알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.

solved.ac