728x90
문제
접근 방식
숫자를 k번만 삭제해서 짝수로만 이루어진 부분 수열 중
가장 긴 부분 수열의 길이를 구해야 한다.
첫 숫자부터 시작 포인트로 정하고 나머지 하나의 포인터를 사용해
다음 숫자들을 탐색해나가면 된다.
{1, 2, 3, 4, 5, 6, 7, 8}
예를 들어 위와 같은 수열이 주어졌고, 2번만 삭제할 수 있다면
짝수만 남겨야하니 홀수를 만날 때만 삭제해주고
다음에 홀수를 만났을 때 더이상 삭제할 기회가 남아있지 않다면
현재 까지 수열의 길이를 계산해주면 된다.
(현재 까지 수열의 길이 = 끝 포인터 - 시작 포인터 - 삭제한 홀수의 갯수)
// 남은 삭제 기회
// 숫자
1 1 0 0 x
1 2 3 4 5
2 1 1 0 0 x
2 3 4 5 6 7
1 1 0 0 x
3 4 5 6 7
2 1 1 0 0
4 5 6 7 8
순서를 살펴보면 위와 같다.
풀이
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int[] arr = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int end = 0;
int max = 0;
int rm = 0;
for (int start = 0; start < n; start++) {
while (end < n) {
if (arr[end] % 2 != 0) {
if (rm == k) break;
rm++;
}
end++;
}
max = Math.max(max, end - start - rm);
if (arr[start] % 2 != 0 && rm <= k) rm--;
}
System.out.println(max);
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 20922번 : 겹치는 건 싫어 (1) | 2023.12.17 |
---|---|
[백준] 2531번 : 회전 초밥 (1) | 2023.12.17 |
[백준] 13144번 : List of Unique Numbers (0) | 2023.12.16 |
[백준] 1644번 : 소수의 연속합 (1) | 2023.12.15 |
[백준] 1806번 : 부분합 (0) | 2023.12.15 |