https://www.acmicpc.net/problem/2531
2531번: 회전 초밥
첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤
www.acmicpc.net
생각해보기
- 계속해서 모든 초밥을 확인하는 경우 O(N * K)로 30,000 * 3,000 약 9천만이라 잘못하면 시간 초과가 나게 된다.
- 어차피 회전 초밥은 한칸씩 움직이므로 맨 처음칸을 제거 해준뒤 다음칸을 확인하면 된다.
코드
#include<iostream>
#include<vector>
using namespace std;
int N,D,K,C;
int arr[30001];
int chk[30001];
int ans = 0;
void input(){
cin>>N>>D>>K>>C;
for(int i=0;i<N;++i)
cin>>arr[i];
}
void solution(){
int l=0;
int cnt=0;
for(int i=0;i<K;++i){
int idx = l + i;
int num = arr[idx];
if(!chk[num]){
++cnt;
}
++chk[num];
}
ans = chk[C] ? cnt : cnt+1;
while(++l<N){
int idx = l-1;
--chk[arr[idx]];
if(!chk[arr[idx]])
--cnt;
idx = (l+K-1)%N;
++chk[arr[idx]];
if(chk[arr[idx]] == 1)
++cnt;
ans = max(ans, chk[C] ? cnt : cnt + 1);
}
cout<<ans<<'\n';
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
input();
solution();
return 0;
}

728x90
'알고리즘 > 백준 문제' 카테고리의 다른 글
| 17615 - 볼 모으기 (0) | 2023.07.23 |
|---|---|
| 24337 - 가희와 탑 (0) | 2023.07.22 |
| 22866 - 탑 보기 (0) | 2023.07.21 |
| 2075 - N번째 큰 수 (0) | 2023.07.21 |
| 14658 - 하늘에서 별똥별이 빗발친다 (0) | 2023.07.20 |
댓글