꾸물꾸물 졔의 개발공부

[백준] 1522 문자열 교환 본문

알고리즘/백준

[백준] 1522 문자열 교환

체제 2023. 10. 24. 20:20

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

 

1522번: 문자열 교환

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

www.acmicpc.net

 

 

[풀이]

  • 주어진 문자열 내의 a 갯수가 a_cnt 개 일 때, 
  • 입력받은 문자열중 a_cnt 개의 문자들을 연속으로 탐색했을 때 모두 a여야 한다. 
  • 단, 원형으로 이루어져 있기 때문에 마지막 문자가 시작점일때까지 모두! 탐색

💡예제 입력 

aabbaaabaaba : a의 갯수 8개 

> 0번 인덱스 부터 a의 갯수만큼 탐색하면서, 해당 탐색문자열에 포함된 b의 갯수가 교환해야 하는 갯수 

aabbaaabaaba : b가 3개, 교환 횟수 3번 

aabbaaabaaba : 교환 횟수 3번 

aabbaaabaaba : 교환 횟수 3번 

aabbaaabaaba : 교환 횟수 3번 

aabbaaabaaba : 교환 횟수 2번

이후 탐색 aabbaaabaaba aabbaaabaaba ...  aabbaaabaaba

 


[소스코드]

import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws Exception{
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
		int min = Integer.MAX_VALUE; 
		String s= br.readLine();
		int a_cnt =0; //a의 갯수
		for(int i=0; i<s.length(); i++) {
			if(s.charAt(i) == 'a') a_cnt ++; 
		}
		
		for(int i=0; i<s.length(); i++) { //원형이기때문에 마지막 인덱스까지 탐색
			int b_cnt =0; 
			for(int j=i; j<i+a_cnt; j++) {
				if(s.charAt(j%s.length()) =='b') b_cnt ++; 
			}
			
			min = Math.min(min, b_cnt); 
		}
		System.out.println(min);
		
	}//end of main
}//end of class