알고리즘/백준

백준 1522 - 문자열 교환(Java)

D_Helloper 2024. 4. 26. 22:01

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

 

1522번: 문자열 교환

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

www.acmicpc.net

문제

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

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

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

입력

첫째 줄에 문자열이 주어진다. 문자열의 길이는 최대 1,000이다.

출력

첫째 줄에 필요한 교환의 회수의 최솟값을 출력한다.

예제 입력 1 복사

abababababababa

예제 출력 1 복사

3

예제 입력 2 복사

ba

예제 출력 2 복사

0

예제 입력 3 복사

aaaabbbbba

예제 출력 3 복사

0

예제 입력 4 복사

abab

예제 출력 4 복사

1

예제 입력 5 복사

aabbaaabaaba

예제 출력 5 복사

2

예제 입력 6 복사

aaaa

예제 출력 6 복사

0

 

풀이

문제를 제대로 읽는데 오래걸렸던 문제,

0번째부터 문자열의 마지막까지 a의 갯수를 세고, 0부터 문자열의 마지막까지 탐색을 진행한다.

만약 b가 있다면 b를 카운트하고 b 카운트의 최솟값을 찾으면 된다.

주의할점은 문자열의 마지막을 처음과 붙여줘야 한다는 것이다.

해당 사항은 i+j가 문자열의 길이보다 클 때, 문자열의 길이만큼 빼줬다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_1522_문자열교환 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        int a_cnt = 0;
        int result = Integer.MAX_VALUE;
        for(int i=0; i<str.length(); i++)
        {
            if(str.charAt(i)=='a')
                a_cnt++;
        }
        for(int i=0; i<str.length();i++)
        {
            int b_cnt=0;
            for(int j=0; j<a_cnt;j++)
            {

                int index = i+j;

                if(index>=str.length()) {
                    index = i + j - str.length();
                }
                if(str.charAt(index)=='b') {
                    b_cnt++;
                }
            }
            result = Math.min(result,b_cnt);
        }
        System.out.println(result);
    }
}