250617 Non-boring sequences

Jongleee·2025년 6월 17일
0

TIL

목록 보기
932/970
private static final int MAX_N = 200_000;
private static final String BORING = "boring\n";
private static final String NON_BORING = "non-boring\n";

private static int[] left = new int[MAX_N];
private static int[] right = new int[MAX_N];
private static HashMap<Integer, Integer> map = new HashMap<>();
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

public static void main(String[] args) throws IOException {
	int t = Integer.parseInt(br.readLine());
	StringBuilder sb = new StringBuilder();
	while (t-- > 0) {
		sb.append(solve() ? NON_BORING : BORING);
	}
	System.out.print(sb);
}

private static boolean solve() throws IOException {
	int n = Integer.parseInt(br.readLine());
	map.clear();
	StringTokenizer st = new StringTokenizer(br.readLine());
	for (int i = 0; i < n; i++) {
		int num = Integer.parseInt(st.nextToken());
		if (map.containsKey(num)) {
			left[i] = map.get(num);
			map.put(num, i);
		} else {
			left[i] = -1;
			map.put(num, i);
		}
	}

	for (int i = 0; i < n; i++) {
		right[i] = n;
		if (left[i] != -1) {
			right[left[i]] = i;
		}
	}

	return isNonBoring(0, n - 1);
}

private static boolean isNonBoring(int l, int r) {
	if (l >= r)
		return true;
	for (int i = l, j = r; i <= j; i++, j--) {
		if (left[i] < l && right[i] > r) {
			return isNonBoring(l, i - 1) && isNonBoring(i + 1, r);
		}
		if (left[j] < l && right[j] > r) {
			return isNonBoring(l, j - 1) && isNonBoring(j + 1, r);
		}
	}
	return false;
}

출처:https://www.acmicpc.net/problem/3408

0개의 댓글