22862번: 가장 긴 짝수 연속한 부분 수열 (large)
수열 $S$에서 최대 $K$번 원소를 삭제한 수열에서 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 출력한다.
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 K, int[] S) {
int answer = 0, lt = 0, cnt = 0;
// 오른쪽 포인터가 배열의 끝까지 갈때까지만 진행
for(int rt = 0; rt < N; rt++) {
if(S[rt] % 2 != 0) cnt++; // 홀수라면 삭제 횟수 증가
// 삭제 가능한 횟수를 초과하면 왼쪽 포인터를 오른쪽으로 옮기기
while(cnt > K) {
if(S[lt] % 2 != 0) cnt--;
lt++;
}
// rt와 lt의 간격을 계산하고, 삭제한 홀수의 개수만큼 빼주기
answer = Math.max(answer, rt - lt + 1 - cnt);
}
return answer;
}
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 K = Integer.parseInt(st.nextToken());
int[] S = new int[N];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
S[i] = Integer.parseInt(st.nextToken());
}
System.out.println(T.solution(N, K, S));
}
}
느낀 점 및 정리 ✍️
1. 코테 대비로 요즘 알고리즘 문제 풀 때 solution 메소드를 따로 생성하여 풀고 있다
2. 투 포인터 알고리즘을 활용하여 풀었다
'Algorithm & SQL > BOJ' 카테고리의 다른 글
[백준 3649번 / Java] BOJ 3649 : 로봇 프로젝트(투 포인터) (2) | 2024.03.12 |
---|---|
[백준 2343번 / Java] BOJ 2343 : 기타 레슨(이분 탐색) (0) | 2024.03.10 |
[백준 15831번 / Java] BOJ 15831 : 준표의 조약돌(투 포인터) (0) | 2024.03.08 |
[백준 15961번 / Java] BOJ 15961 : 회전 초밥(슬라이딩 윈도우, 원형 배열) (0) | 2024.03.07 |
[백준 1735번 / Java] BOJ 1735 : 분수 합 (유클리드 호제법) (0) | 2024.03.02 |