Skip to content

Commit 84e9a11

Browse files
authored
[Week08] BOJ 2531: 회전초밥
[Week08] BOJ 2531: 회전초밥
2 parents dbcc8dd + 4f0f040 commit 84e9a11

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package it_company_work_book.silver;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
7+
// 회전초밥
8+
// 투포인터, 브루트포스, 슬라이딩 윈도우
9+
/**
10+
* 현 윈도우 상태에 맞게 현재 먹은 스시 개수 및 중복을 처리할 sushiCounts 배열을 두고,
11+
* 중복과 쿠폰을 고려해서 겹치지 않는 스시 개수를 구할 uniqueCount 을 둔다.
12+
* 초기 슬라이딩 윈도우 값을 구한 다음, 해당 값에서 인덱스를 1씩 이동해가며 윈도우의 처음 인덱스 값을 윈도우의 다음 인덱스를 추가한다.
13+
* 원형 배열이기 때문에 %연산을 통해서 범위를 지정한다.
14+
*/
15+
public class BOJ_2531 {
16+
17+
public static void main(String[] args) throws IOException {
18+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
19+
20+
String []s = br.readLine().split(" ");
21+
int N = Integer.parseInt(s[0]);
22+
int d = Integer.parseInt(s[1]);
23+
int k = Integer.parseInt(s[2]);
24+
int c = Integer.parseInt(s[3]);
25+
26+
int [] dishes = new int[N];
27+
28+
for(int i=0; i<N; i++){
29+
int dish = Integer.parseInt(br.readLine());
30+
dishes[i] = dish;
31+
}
32+
33+
int [] sushiCounts = new int[d+1]; // 각 초밥 종류별 먹은 개수
34+
int uniqueCount = 0; // 현재 윈도우 내 고유한 초밥의 개수
35+
36+
for(int i=0; i<k; i++){
37+
if(sushiCounts[dishes[i]] == 0){
38+
uniqueCount++; // 처음 먹어보는 종류라면 증가
39+
}
40+
sushiCounts[dishes[i]]++;
41+
}
42+
43+
int maxCount = uniqueCount;
44+
45+
// 먹은 초밥에 쿠폰 초밥이 없다면 +1
46+
if(sushiCounts[c] == 0){
47+
maxCount = Math.max(maxCount, uniqueCount + 1);
48+
}
49+
50+
for(int i=0; i<N; i++){
51+
int removeDish = dishes[i];
52+
sushiCounts[removeDish]--;
53+
if(sushiCounts[removeDish] == 0){ // 더이상 이 종류의 초밥이 윈도우에 없다면
54+
uniqueCount--;
55+
}
56+
57+
// 새로 들어오올 초밥 추가, 원형 배열이므로 %로 인덱스 처리
58+
int addDish = dishes[(i+k) %N];
59+
if(sushiCounts[addDish] == 0){
60+
uniqueCount++;
61+
}
62+
sushiCounts[addDish]++;
63+
64+
// 최대 가짓수 갱신 (쿠폰 초밥 포함 여부 확인)
65+
int currentMax = uniqueCount;
66+
if(sushiCounts[c] == 0){
67+
currentMax++;
68+
}
69+
maxCount = Math.max(maxCount, currentMax);
70+
}
71+
72+
System.out.println(maxCount);
73+
74+
}
75+
}

0 commit comments

Comments
 (0)