알고리즘

[백준17615] 볼 모으기 - 자바(JAVA)

사랑박 2023. 8. 3. 10:15

1. 문제

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

 

17615번: 볼 모으기

첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주

www.acmicpc.net

 

2. 풀이

볼이 모여있는 뭉탱이(?)의 갯수가 홀수일 때/짝수일 때 경우의 수를 나눠서 문제를 풀었습니다.

  1. 볼 뭉탱이 갯수가 `홀수`일 때
    R / BBB / R / B / RRR 이면 뭉탱이가 홀수개 입니다.
    `하나(R)`은 왼쪽 끝, 오른쪽 끝에 감싸고 있고 `하나는(B)`는 사이에 껴 있습니다.
    R은 왼쪽 끝(1개), 오른쪽 끝(3개) 중에서 많은 쪽으로 나머지 뭉탱이를 다 옮기면 됩니다. 1+1=2
    B는 왼쪽으로 옮기나 오른쪽으로 옮기나 똑같아서 뭉탱이 다 더하면 됩니다. 3+1=4
    R, B 옮기는 것 중에 작은게 답입니다.
  2. 볼 뭉탱이 갯수가 `짝수`일 때
    BB / R / BBBB / R / BB / RRR 이면 뭉탱이가 짝수개 입니다.
    `하나(B)`는 왼쪽 끝에 있고, `하나(R)`은 오른쪽 끝에 있습니다.
    B는 이미 왼쪽에 모여있으니까 나머지 뭉탱이를 그냥 왼쪽으로 옮기면 됩니다. 4+2=6
    R은 이미 오른쪽에 모여있으니까 나머지 뭉탱이를 오른쪽으로옮기면 됩니다. 1+1=2
    R, B 옮기는 것 중에 작은게 답입니다.

 

3. 코드

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

public class BOJ17615 {

	static int N;

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		N=Integer.parseInt(br.readLine());
		char[] balls=br.readLine().toCharArray();
		ArrayList<Integer> arr=new ArrayList<>();

		int cnt=1;
		char cur=balls[0];

            	// ArrayList에 볼 뭉탱이 갯수를 저장
		for(int i=1;i<N;i++) {
			if(cur==balls[i]) {
				cnt++;
			}else {
				arr.add(cnt);
				cur=balls[i];
				cnt=1;
			}
		}
		arr.add(cnt);

    		// 뭉탱이 크기가 1개 또는 2개면 0으로 출력하고 RETURN
		if(arr.size()==1||arr.size()==2) {
			System.out.println(0);
			return;
		}

		if(arr.size()%2==1) { // 뭉탱이 갯수가 홀수일 때
			// 1번 (ArrayList 인덱스 짝수번째 총합) - (맨앞 / 맨뒤중에 더 큰거) 
			int sum=0;
			for(int i=0;i<=arr.size()-1;i+=2) {
				sum+=arr.get(i);
			}
			sum=sum-Math.max(arr.get(0), arr.get(arr.size()-1));

			// 2번 (ArrayList 인덱스 홀수번째 총합)
			int sum2=0;
			for(int i=1;i<=arr.size()-1;i+=2) {
				sum2+=arr.get(i);
			}
      			// 더 큰게 정답
			System.out.println(Math.min(sum, sum2));

		}else if(arr.size()%2==0) { // 뭉탱이 갯수가 짝수일 때
			// 1번 (ArrayList 인덱스 짝수번째 총합) - (맨 앞)
			int sum=0;
			for(int i=0;i<=arr.size()-1;i+=2) {
				sum+=arr.get(i);
			}
			sum=sum-arr.get(0);
			// 2번 (ArrayList 인덱스 홀수번째 총합) - (맨 뒤)
			int sum2=0;
			for(int i=1;i<=arr.size()-1;i+=2) {
				sum2+=arr.get(i);
			}
			sum2=sum2-arr.get(arr.size()-1);
      			// 더 큰게 정답
			System.out.println(Math.min(sum, sum2));
		}
	}
}