728x90
투포인터 문제입니다.
회전초밥에서 연속하는 k개를 골랐을 때 최대한 다양한 메뉴를 골라야합니다.
k개를 골랐을 때 쿠폰으로 한 종류를 주기 때문에 그 종류는 먹은것으로 생각하고 계산해도 됩니다.
left와 right를 k거리만큼 두고 한칸씩 이동합니다.
이동하면서 left의 위치에 있는것은 해당 종류의 초밥을 1개 덜 먹는것으로 하고
right의 위치에 있는것은 해당 종류의 초밥을 1개 더 먹는것으로 합니다.
1개 덜 먹는것으로 할 때 원래 가능한 개수가 2개이상이였으면 1개를 빼도 1개이상이 되므로
못 먹는것으로 판단하지 않습니다.
left가 n-1일때 까지 반복하며
해당 과정을 통해서 가장 많은 종류의 음식을 먹을때를 찾아서 출력해주었습니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int ans = 0;
int left = 0;
int right = 0;
int cnt = 0;
int[] arr = new int[n];
int[] eat = new int[d+1];
for(int i=0; i<n; ++i) {
arr[i] = Integer.parseInt(br.readLine());
}
for(int i=0; i<k; ++i) {
++eat[arr[right]];
if(eat[arr[right]] == 1) {
++cnt;
}
++right;
}
ans = cnt;
while(left != n) {
--eat[arr[left]];
if(eat[arr[left]] == 0) {
--cnt;
}
++left;
++eat[arr[right]];
if(eat[arr[right]] == 1) {
++cnt;
}
++right;
if(right == n) {
right = 0;
}
if(eat[c] == 0) {
ans = Math.max(ans, cnt + 1);
} else {
ans = Math.max(ans, cnt);
}
}
bw.write(ans + "");
bw.close();
}
}
'알고리즘' 카테고리의 다른 글
[Java] 백준 17208번 카우버거 알바생 (0) | 2023.03.08 |
---|---|
[Java] 백준 6087번 레이저 통신 (0) | 2023.03.07 |
[Java] 백준 1823번 수확 (0) | 2023.03.07 |
[Java] 백준 2042번 구간 합 구하기 (0) | 2023.03.06 |
[Java] 백준 14003번 가장 긴 증가하는 부분 수열 5 (0) | 2023.03.04 |