1. 문제
https://www.acmicpc.net/problem/17615
17615번: 볼 모으기
첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주
www.acmicpc.net
2. 풀이
볼이 모여있는 뭉탱이(?)의 갯수가 홀수일 때/짝수일 때 경우의 수를 나눠서 문제를 풀었습니다.
- 볼 뭉탱이 갯수가 `홀수`일 때
R / BBB / R / B / RRR 이면 뭉탱이가 홀수개 입니다.
`하나(R)`은 왼쪽 끝, 오른쪽 끝에 감싸고 있고 `하나는(B)`는 사이에 껴 있습니다.
R은 왼쪽 끝(1개), 오른쪽 끝(3개) 중에서 많은 쪽으로 나머지 뭉탱이를 다 옮기면 됩니다. 1+1=2
B는 왼쪽으로 옮기나 오른쪽으로 옮기나 똑같아서 뭉탱이 다 더하면 됩니다. 3+1=4
R, B 옮기는 것 중에 작은게 답입니다. - 볼 뭉탱이 갯수가 `짝수`일 때
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));
}
}
}
'알고리즘' 카테고리의 다른 글
[백준 1753] 최단경로 (다익스트라 알고리즘) - 자바(JAVA) (1) | 2023.10.11 |
---|---|
[백준 11060] 점프 점프 - 자바(JAVA) (1) | 2023.08.10 |
[백준2615] 오목 - 자바(JAVA) (0) | 2023.08.02 |
[백준11286] 절댓값 힙 - 자바(JAVA) (0) | 2023.07.29 |
[백준2302] 극장 좌석 - 자바(JAVA) (0) | 2023.07.21 |