백준 20365번: 블로그2, 색이 이어지는 구간 세기
연속된 같은 색은 한 묶음입니다
백준 20365번 블로그2는 주어진 색 배열을 만드는 최소 색칠 횟수를 구하는 문제입니다.

문제에 주어진 힌트에서 풀이 방향을 잡았습니다.

전체를 한 색으로 먼저 칠하고 다른 색이 필요한 구간만 덧칠하면 됩니다. 이때는 색의 칸 수보다 연속된 구간의 수를 봅니다.
중복을 줄인 뒤 두 색의 구간 수를 셉니다
예를 들어 BB RRR B RR B에서 연속 중복을 제거하면 B R B R B가 됩니다. B 구간은 세 개, R 구간은 두 개입니다. 전체를 B로 한 번 칠하고 R 구간 두 곳을 덧칠하면 모두 세 번 칠하게 됩니다.
그래서 두 색의 구간 수 중 작은 값에 전체를 칠하는 한 번을 더합니다. 두 구간 수가 같으면 어느 색을 먼저 칠해도 같습니다.
코드에서는 중복을 제거한 뒤의 길이가 정해져 있지 않아 ArrayList에 색을 저장했습니다. 첫 색을 넣고 한 번 센 뒤, 다음 색부터는 마지막에 저장한 색과 비교해서 색이 달라질 때만 리스트에 넣고 해당 색의 구간 수를 늘립니다. 마지막 원소의 위치는 arr.size() - 1입니다.
제출 코드
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
ArrayList<Character> arr = new ArrayList<>();
//0 = B, 1 = R
int[] cnt = new int[2];
int N = Integer.parseInt(br.readLine());
String line = br.readLine();
arr.add(line.charAt(0));
if(arr.get(0) == 'B') cnt[0]++;
else if (arr.get(0) == 'R') cnt[1]++;
for (int i = 1; i < N; i++) {
if (!arr.get(arr.size() - 1).equals(line.charAt(i))) {
char c = line.charAt(i);
arr.add(c);
if(c == 'B') cnt[0]++;
else if (c == 'R') cnt[1]++;
}
}
bw.write(String.valueOf(Math.min(cnt[0], cnt[1]) + 1));
bw.flush();
}
}