[백준] 문자열 교환 1522 java

오늘내일·2024년 6월 25일
0

최적의 풀이는 아니지만 문제 접근하는 방법이 참고가 될 수 있지 않을까해서 올려봅니다. 코드에 주석 참고해주세요.

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

public class Main {
  // a를 연속으로 만들기 위해 필요한 교환의 횟수
  // 문자열은 원형
  // 슬라이딩 윈도우 --> 윈도우 사이즈는 b의 총 개수!
  // 윈도우에 a 개수 최소값을 구하면 된다.
  // ex. abababababababa : b 7개
  // 처음 윈도우 인덱스 0 ~ 6 : abababa --> a : 4개
  // 두번째 윈도우 인덱스 1 ~ 7 : bababab --> a : 3개
  // 세번째 윈도우 인덱스 2 ~ 8 : abababa --> a : 4개
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String input = br.readLine();

    // 문자열에 b가 몇 개인지 카운트한다.
    int bCount = 0;
    for (int i = 0; i < input.length(); i++) {
      if (input.charAt(i) == 'b') {
        bCount++;
      }
    }

    // 처음으로 구성하는 윈도우(인덱스 0~ bCount-1)의 a 개수를 카운트한다.
    int aCount = 0;
    for (int i = 0; i < bCount; i++) {
      if (input.charAt(i) == 'a') {
        aCount++;
      }
    }


    int result = aCount;
    // 문자열을 순회하며 슬라이딩 윈도우에 하나 추가하고 하나 제거하여 a개수를 계산한다.
    for (int i = 1; i < input.length(); i++) {
      // 원소 하나 제거
      if (input.charAt(i - 1) == 'a') {
        aCount--;
      }

      // 원소 하나 추가
      int idx = (i + bCount - 1) % input.length();
      if (input.charAt(idx) == 'a') {
        aCount++;
      }

      result = Math.min(result, aCount);
    }

    System.out.println(result);
  }
}
profile
다시 시작합니다.

0개의 댓글