본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 1522번 문자열 교환

by 현장 2026. 3. 5.

-Code

import java.util.*;

public class BOJ1522 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String str = sc.next();
        // 역순도 확인해야 하므로 2배로 길이 늘려 저장
        int aCnt = 0;
        int length = str.length();
        char[] chars = new char[length * 2];
        for (int i = 0; i < length; i++) {
            char now = str.charAt(i);
            aCnt += now == 'a' ? 1 : 0;
            chars[i] = now;
            chars[i + length] = now;
        }
        // a의 갯수만큼 뭉쳐야 하므로 해당 범위안에 b의 갯수의 최소값이 정답
        int answer = Integer.MAX_VALUE;
        for (int i = 0; i < length; i++) {
            int bCnt = 0;
            for (int j = 0; j < aCnt; j++) {
                bCnt += chars[i + j] == 'b' ? 1 : 0;
            }
            answer = Math.min(answer, bCnt);
        }
        System.out.println(answer);
        sc.close();
    }
}

처음에는 2개의 포인터로 양쪽을 변경하며 계산하려 했으나 출력이 이상하게 나왔습니다. 그래서 힌트를 찾아보니 특정 단어의 개수를 새고 그 개수만큼 같은 단어로 채워야 하므로 그 안에 특정 단어가 아닌 다른 단어의 개수의 최소를 구하면 됐습니다. 하지만 추가적으로 끝에서 다시 처음으로 돌아오는 즉 순환되는 부분도 검사를 해야 해서 해당 부분도 수정하여 해결했습니다.