알고리즘/백준
15961_회전 초밥
베리영young
2024. 8. 22. 02:56
사용 알고리즘: 슬라이딩 윈도우
사용 언어: java
package ssafyAlgorithm;
import java.io.*;
import java.util.*;
public class Main_bj_15961_회전초밥 {
static int n,d,k,c, dishes[], list[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt(); //접시 개수
dishes = new int[n];
d = sc.nextInt(); //초밥 가지수
list = new int[d+1];
k = sc.nextInt(); //연속 접시 수
c = sc.nextInt(); //쿠폰 번호
for(int i=0; i<n; i++) {
dishes[i] = sc.nextInt();
}
list[c]++; //쿠폰은 먹이고 시작
int ans = 0;
for (int i = 0; i < k; i++) {
list[dishes[i]]++;
}
for (int i = 0; i < list.length; i++) {
if(list[i] > 0) ans++;
}
//
int tmpCnt = ans;
for (int startDish = 1; startDish < n; startDish++) {
int prevCnt = tmpCnt;
list[dishes[startDish-1]]--; //지울 거
if(list[dishes[startDish-1]] == 0) prevCnt--;
int end = startDish+k - 1; //더할 거
if(end >= n) end = end%n;
list[dishes[end]]++;
if(list[dishes[end]] == 1) prevCnt++;
ans = Math.max(ans, prevCnt);
tmpCnt = prevCnt;
}
System.out.println(ans);
}
}
코드가 아주 더럽구나...
채점하는 데 시간도 오래 걸렸다...
처음엔 Map에 집어넣고 map.size()로 구하려고 했는데, 시간 초과 났던 거 같다.
그래서 힌트 참고해서 슬윈으로 만들었는데, list[dishes[startDish-1]]를 처음에 list[startDish-1]로 해서 틀렸고,
prevCnt를 안 쓰고 tmpAns만 써서 또 틀렸다. (이렇게 하면 기존 ans가 4이고, tmpANs가 3일 때, ans는 그대로 4로 남기 때문에 그다음에 tmpAns는 3이 아닌 4로 시작하게 되고 -> 이렇게 되면 원래 답보다 크게 나올 수밖에 없다. 그래서 이를 해결하기 위해 prevCnt를 써서 tmpAns값과 서로 주고 받고 하면서 이 문제를 해결했다 -> 이 부분이 코드가 더러워지는 데 일조를 한 느낌)