Home G15961. 회전 초밥
Post
Cancel

G15961. 회전 초밥

문제

image


제출 코드

image


✏️ S2531. 회전 초밥 과 동일한 문제이나, 테케의 범위가 더 넓어져 기존 코드로는 시간초과가 났다.


기존 코드의 로직 자체는 더이상 최적화 할 수 없다고 판단해서, 구현 부분에서 줄일 수 있는 것을 찾았다. 아래의 두가지를 수정해 보았다.

  1. **queue 제거**

    자료구조에서 메서드 호출하는 부분이 잦아지면 시간소요가 크다고 했어서, Queue를 사용한 부분을 지워줬다. 다시보니 크게 필요하지 않은 부분이었더라.

  2. **result 값 도출 방식**

    기존 코드에서는, 매번 result를 구할때마다 최대값만 저장하도록 매 회차마다 비교를 했다.

    이전에 문자열 관련 문제 풀 때, 값을 받아오는 즉시 비교해서 값을 넣는것보다 모든 값을 불러온 뒤 Arrays.sort를 통해 정렬하는 것이 빨랐던 기억이 있어, 모든 값 저장후 정렬로 최대값 찾는 방식으로 바꿔보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package gold;

import java.util.Arrays;
import java.util.Scanner;

public class G15961_rotateSushi {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int D = sc.nextInt();
		int K = sc.nextInt();
		int C = sc.nextInt();

		int[] rotate = new int[N];
		int[] overap = new int[D+1];
		int overapCnt = 0;
		for(int i=0; i<N; i++) {
			rotate[i] = sc.nextInt();
			if(i<K) {
				if(++overap[rotate[i]]>1) overapCnt++;
			}
		}
		int[] result = new int[N];
		result[0] = K-overapCnt + (overap[C]>0 ? 0 : 1);
		for(int i=K; i<N+K; i++) {
			int out = rotate[(i-K+N)%N];
			if(--overap[out]>0) overapCnt--;

			int in = rotate[i%N];
			if(++overap[in]>1) overapCnt++;

			result[i%N] = K-overapCnt + (overap[C]>0 ? 0 : 1);
		}
		Arrays.sort(result);
		System.out.println(result[N-1]);
	}

}
This post is licensed under CC BY 4.0 by the author.