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); } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2493 탑 - 자료구조 Stack(스택) JAVA (0) | 2023.08.10 |
---|---|
[백준] 20055 컨베이어 벨트 위의 로봇 - 구현 + 시뮬레이션 JAVA (0) | 2023.08.10 |
[백준] 1138 한 줄로 서기 - 구현(Implementation) + 그리디(Greedy, 탐욕법) + 아이디어 JAVA (0) | 2023.08.09 |
[백준] 2075 N 번째 큰 수 - 정렬(Sort) + 우선순위큐(PriorityQueue) JAVA (0) | 2023.08.09 |
[백준] 2304 창고 다각형 - 구현 + 그리디 JAVA (0) | 2023.08.08 |