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

 

17615번: 볼 모으기

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

www.acmicpc.net

코드설명

구현과 그리디를 활용하는 문제입니다.

 

문제의 로직은,

위의 볼의 이동수를 구할때 한쪽으로 모으는 경우에는 한쪽의 처음에 모여있는 firstBallCnt를 구한뒤

firstBallCnt - blueCnt를 빼면 모여있는 한쪽 볼 이외의 공의 개수가 나오는데 그 공의 개수가 이동횟수입니다.

 

그리고 위의 로직을 이용하여

 

1. 'R'을 맨 왼쪽으로 모으는 경우 RRRRRBBBBB

2. 'R'을 맨 오른쪽으로 모으는 경우 BBBBBRRRR

3. 'B'을 맨 왼쪽으로 모으는 경우 BBBBBRRRRR

4. 'B'을 맨 오른쪽으로 모으는 경우 RRRRBBBBB

 

위의 4가지를 모두 구하여서 최소값을 출력합니다.

 

코드

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


public class Main {
	public static int N, K;
	public static char[] arr;
	public static int answer = 500001;
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	N = Integer.parseInt(st.nextToken());
    	
    	arr = new char[N];
    	st = new StringTokenizer(br.readLine());
		arr = st.nextToken().toCharArray();
		
		int firstBallCnt = 0;
		int redCnt = 0;
		int blueCnt = 0;		
	
		//전체 공의 색깔 계산
		for(int i=0;i<N;i++) {
			if(arr[i] == 'R') {
				redCnt += 1;
			}
			if(arr[i] == 'B'){
				blueCnt += 1;
			}
		}
			
		//1. 'R'을 맨 왼쪽으로 모으는 경우 RRRRRBBBBB
		for(int i=0;i<N;i++) {
			if(arr[i] == 'R') {
				firstBallCnt += 1;
			}else {
				break;
			}
		}
		
		answer = Math.min(answer,  redCnt - firstBallCnt);
		
		firstBallCnt = 0;
		//2. 'R'을 맨 오른쪽으로 모으는 경우
		for(int i=N-1;i>=0;i--) {
			if(arr[i] == 'R') {
				firstBallCnt += 1;
			}else {
				break;
			}
		}
		
		answer = Math.min(answer,  redCnt - firstBallCnt);
		
		firstBallCnt = 0;
		//1. 'R'을 맨 왼쪽으로 모으는 경우 RRRRRBBBBB
		for(int i=0;i<N;i++) {
			if(arr[i] == 'B') {
				firstBallCnt += 1;
			}else {
				break;
			}
		}
		
		answer = Math.min(answer,  blueCnt - firstBallCnt);
		
		firstBallCnt = 0;
		//2. 'R'을 맨 오른쪽으로 모으는 경우
		for(int i=N-1;i>=0;i--) {
			if(arr[i] == 'B') {
				firstBallCnt += 1;
			}else {
				break;
			}
		}
		
		answer = Math.min(answer,  blueCnt - firstBallCnt);		
		
		System.out.println(answer);
    }
    
      
}

+ Recent posts