반응형
문제 이해 |
![]()
회전 초밥 음식점의 벨트 상태, 메뉴에 있는 초밥의 가짓수, 연속해서 먹는 접시의 개수, 쿠폰 번호가 주어졌을 때, 손님이 먹을 수 있는 초밥 가짓수의 최댓값을 구하는 프로그램을 작성하시오. |
아이디어 |
1. 서로 다른 수의 초밥을 K개 뽑는다. 2. 뽑힌 초밥들과 쿠폰에 쓰인 초밥 종류가 다른 집합을 찾는다.(같으면 더하지말고) 3. 출력한다. 관건은 k개의 연속된 초밥을 어떻게 뽑을지였다. 그냥 쿠폰초밥을 미리 check배열에 넣어두고 cnt를1부터시작한다. 일단미리4개넣어놓고, 맨앞을 빼고 (기존4개까지+1)의위치를 붙여주면 다시 새로운 그룹이 된다. 카운트는 0일때 넣을때 +1, 뺐는데 0이 되면 -1 해주고, 맥스값을 갱신해간다. |
코드 |
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
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[] sushi = new int[N];
for(int i=0;i<N;++i) sushi[i] = Integer.parseInt(br.readLine());
System.out.println(max(sushi,D,K,C));
}
static int max(int[] sushi, int D, int K, int C) {
int[] check = new int[D+1]; // 이미 뽑혔는지 체크
int cnt =1; // cnt변수C를넣어놔서1부터시작
check[C]++; // 미리 넣어둔다.
for(int i=0;i<K; ++i) if(check[sushi[i]]++ == 0) cnt++; // 처음4자리를넣는다
int max = cnt; // 반환할 변수
for(int i=0;i<sushi.length;++i) {
if(check[sushi[(i+K)%sushi.length]]++ == 0) cnt++; // 안뽑혔던상태면 카운팅
if(--check[sushi[i]]==0)cnt--; // 뺐는데 0이면 카운트빼준다.
max=Math.max(max, cnt); // 최대값갱신
}
return max;
}
}
집사는개발자가되고파
choppadontbiteme.tistory.com
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[ BOJ ] 2564. 경비원 S1 JAVA (0) | 2021.04.16 |
---|---|
[ BOJ ] 16562. 친구비 G3 JAVA (0) | 2021.04.15 |
[BOJ] 16174 점프왕 쩰리 G5 (JAVA) (0) | 2021.04.12 |
[BOJ] 2887. 행성터널 G1 JAVA (0) | 2021.03.31 |
[BOJ] 1520. 내리막길 G4 JAVA (0) | 2021.03.31 |