[백준] 볼 모으기 17615 java

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

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

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

public class Main {
  // 볼을 옮겨서 같은 색 볼끼리 인접하게 놓이도록
  // 바로 옆에 다른 색깔의 볼이 있으면 그 볼을 모두 뛰어 넘어 옮길 수 있다
  // 옮길 수 있는 볼의 색깔은 한가지
  // 최소 이동횟수를 구하라
  // 경우의 수는 왼쪽에서 오른쪽으로 공을 옮기는 경우와 오른쪽에서 왼쪽으로 공을 옮기는 경우가 있을 수 있고,
  // 각 붉은 공을 옮기거나 파란 공을 옮길 수 있기 때문에 총 4가지의 경우가 있다.
  // RBBBRBRRR 의 예제로 생각해보자.
  // 문자열 : R B B B R B R R R
  // 인덱스 : 0 1 2 3 4 5 6 7 8
  // 왼쪽에서 오른쪽으로 빨간공을 옮기는 경우를 생각해보면,
  // 4번 공을 옮기고, 1번 공을 옮기면 된다.
  // 구현 관점에서 보면 마지막 인덱스부터 0번 인덱스로 하나씩 문자를 보면서 최초로 나온 파란공(5번 인덱스) 이후의
  // 붉은 공을 전부 옮겨야 하므로 최초로 나온 파란공(5번 인덱스)보다 작은 인덱스의 붉은 공을 카운트 해주면 된다.
  // 위 과정을 경우의 수에 맞게 반복하면 된다.
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());
    String balls = br.readLine();


    int answer = Integer.MAX_VALUE;
    for (int i = 0; i < 2; i++) {
      char count;
      char start;
      if (i == 0) {
        count = 'R';
        start = 'B';
      } else {
        count = 'B';
        start = 'R';
      }

      boolean countStart = false;
      int result = 0;
	  // 공을 왼쪽에서 오른쪽으로 옮기는 경우
      for (int j = n - 1; j >= 0; j--) {
        if (balls.charAt(j) == start && !countStart) {
          countStart = true;
          continue;
        }

        if (countStart) {
          if (balls.charAt(j) == count) {
            result++;
          }
        }
      }

      answer = Math.min(result, answer);

      countStart = false;
      result = 0;
      // 공을 오른쪽에서 왼쪽으로 옮기는 경우
      for (int j = 0; j < n; j++) {
        if (balls.charAt(j) == start && !countStart) {
          countStart = true;
          continue;
        }

        if (countStart) {
          if (balls.charAt(j) == count) {
            result++;
          }
        }
      }
      answer = Math.min(result, answer);
    }

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

0개의 댓글