🟦/백준
[실버 1] 회전 초밥
진뚱이용
2023. 3. 16. 00:01
https://www.acmicpc.net/problem/2531
2531번: 회전 초밥
첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤
www.acmicpc.net
풀기 전:
뭐가 이렇게 복잡해
1. 범위 k개로 해서 한 바퀴 돌면서 hashMap에 담자
이런 다음에 hashMap 돌면서 hashMap.size max 찾고
max개인 것들 안에서 쿠폰넘버 뒤져서 없으면 답은 max+1개인 거다
풀어보자
메모리초과 너무 다 저장하려고 했나
주어진 힌트를 전부 사용하려고 해 보자
int [] check = new int [초밥의 가짓수];
check [쿠폰번호] = 1;
number =1;
max =0;
쿠폰을 무조건 쓴다고 생각하고 처음부터 넣고 시작
check [초밥번호] = 0 이 되면 종류에서 빠진 거기 때문에 number--;
check [초밥번호] = 1 이 되면 종류에서 새로 추가된 거 기 때문에 number++;
left가 N이 되면 종료하고 매번 max 갱신해 주기
정답은 max
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int N;
int d;
int k;
int c;
int[] arr;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
arr = new int[N];
for (int i = 0; i < N; i++)
arr[i] = Integer.parseInt(br.readLine());
/////////////////////////////////////////////////////////////////////////////
무난하게 입력받기
int[] check = new int[d + 1];
check[c] = 1;
int count = 1;
int max;
int left = 0;
int right = 0;
for (; right < k; right++) {
check[arr[right]] = check[arr[right]] + 1;
if (check[arr[right]] == 1)
count++;
}
max = count;
while (left < N) {
check[arr[left]] = check[arr[left]] - 1;
if (check[arr[left]] == 0)
count--;
left++;
check[arr[right]] = check[arr[right]] + 1;
if (check[arr[right]] == 1)
count++;
right = (right+1)%N;
if (max < count)
max = count;
}
sb.append(max+"");
System.out.println(sb);
}
}