Algorithm & SQL/BOJ
[백준 15831번 / Java] BOJ 15831 : 준표의 조약돌(투 포인터)
김룹
2024. 3. 8. 14:46
15831번: 준표의 조약돌
첫 줄에 조약돌의 총 개수 N, 준표가 원하는 검은 조약돌의 최대개수 B와 하얀 조약돌의 최소개수 W가 주어진다. 둘째 줄에는 N개의 조약돌의 정보가 한 줄로 주어진다. i번째 문자가 B라면 i번 조
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public int solution(int N, int B, int W, char[] arr) {
int lt = 0, rt = 0; // 왼쪽 포인터, 오른쪽 포인터
int max = 0;
int[] stone = new int[2]; // stone[0] = W의 개수, stone[1] = B의 개수
while(rt < N) {
// 현재 rt 위치의 돌 추가
if(arr[rt] == 'B') stone[1]++;
else stone[0]++;
// B의 개수가 문제에서 입력받은 B개를 넘어서면
// 가장 왼쪽에 있던 돌을 빼면서 왼쪽 포인터를 증가
if(B < stone[1]) {
if(arr[lt] == 'B') stone[1]--;
else stone[0]--;
lt++;
}
// W돌의 개수가 입력받은 W개 이상이 되면 최댓값 갱신
if(stone[0] >= W) max = Math.max(max, rt - lt + 1);
rt++; // 오른쪽 포인터 이동
}
return max;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Main T = new Main();
int N = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
char[] arr = br.readLine().toCharArray();
System.out.println(T.solution(N, B, W, arr));
}
}
느낀 점 및 정리 ✍️
1. 코딩테스트 대비하고자 프로그래머스 제출 형식에 맞춰 solution 메소드를 생성하여 코드를 작성했다.
2. 첫 제출에서는 14%에서 틀렸습니다가 떴었고 두 번째 제출에서 맞았다. 왜 처음부터 완벽하게 못맞추는거니............!!!!!!!!!!!!!!!!!!! 주어진 테스트 케이스 2개만 통과하면 그냥 제출해보는 안좋은.. 습관이 .. ^^ ㅎ 코테때 시간도 촉박할텐데 걱정이당 😓
3. 오른쪽 포인터를 증가시키면서 해당 자리에 있는 돌의 개수를 세어주었다. 그러다가 입력받은 B 숫자보다 검정돌이 많아질 경우, 가장 왼쪽에 있는 돌을 하나 빼고 왼쪽 포인터의 위치를 우측으로 옮겨준다. 가지고 있는 흰색 돌의 개수가 입력받은 W 숫자 이상일 경우, 최댓값을 갱신해주는 방식으로 풀었다.