Step-by-Step

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

언어/JAVA

[Java] 백준 1522 - 문자열 교환

희주(KHJ) 2022. 11. 27. 16:44

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

 

1522번: 문자열 교환

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

www.acmicpc.net

투포인터 사용하는 문제이다.

 

처음에는 연속된 b값이 가장 많은 것을 기준으로 옆에 붙이려고 했는데, 

bababa 이런 경우는 맨 앞의 b두번째 b와 세번째 b사이에 넣는 작업 한 번만 해주면 연속적이게 된다.

 

※ 방법

a의 개수를 구한 후, 연속적인 a 범위 내에서 내부에 있는 b의 개수가 최소인 경우를 구하면 된다.

0~aCnt / 1~(aCnt+1) / ..    → 이런식으로 투 포인터 사용

 

코드

package BOJ_1000;

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

public class boj1522 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String[] str = br.readLine().split("");
		
		int aCnt = 0, strlen = str.length;
		for(String s : str) {
			if(s.equals("a"))
				aCnt++;
		}
		
		
		if(aCnt >= strlen-1) {
			bw.write("0");
			bw.flush();
			bw.close();
			return ;
		}
		
		int minCnt = Integer.MAX_VALUE;
		// 시작점
		for(int i=0; i<strlen; i++) {
			int bCnt = 0;
			// 범위
			for(int j=0; j<aCnt; j++) {
				int idx = (i+j)%strlen;
				if(str[idx].equals("b")) {
					bCnt++;
				}
			}
			
			minCnt = Math.min(minCnt, bCnt);
		}
		bw.write(minCnt+"");
		bw.flush();
		bw.close();
	}
}
Comments