개발자 톡

연습문제 톡 [21년 재직자 대회 본선] 비밀 메뉴2

[21년 재직자 대회 본선] 비밀메뉴2

등록일
2023-02-14 11:35:32
조회수
708
작성자
ahajongs


import java.util.*;
import java.io.*;

public class Main {
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());

		Set set1 = new HashSet<>();

		st = new StringTokenizer(br.readLine(), " ");
		int[] arr1 = new int[N];
		for (int i = 0; i < N; i++) {
			arr1[i] = Integer.parseInt(st.nextToken());
		}

		st = new StringTokenizer(br.readLine(), " ");
		int[] arr2 = new int[M];
		for (int i = 0; i < M; i++) {
			arr2[i] = Integer.parseInt(st.nextToken());
		}

		int answer = 0;

		for (int i = 0; i < N; i++) {
			StringBuilder sb = new StringBuilder();
			sb.append(arr1[i]).append(" ");
			set1.add(sb.toString());
			for (int j = i + 1; j < N; j++) {
				sb.append(arr1[j]).append(" ");
				set1.add(sb.toString());
			}
		}

		for (int i = 0; i < M; i++) {
			StringBuilder sb = new StringBuilder();
			sb.append(arr2[i]).append(" ");
			if (set1.contains(sb.toString()))
				answer = Math.max(answer, sb.toString().split(" ").length);
			for (int j = i + 1; j < M; j++) {
				sb.append(arr2[j]).append(" ");
				if (set1.contains(sb.toString()))
					answer = Math.max(answer, sb.toString().split(" ").length);
			}
		}

		bw.write(String.valueOf(answer));
		bw.flush();
		bw.close();
	}
}


N을 돌면서 연속 부분수열을 set에 저장하고 M을 돌면서 set에 포함된 연속 부분수열중 가장 긴 길이를 구하도록 구현하였습니다.

O(N*N + M*M)으로 예상하고 풀었는데.. 시간초과가 뜨는데 왜그럴까요?

#[21년_재직자_대회_본선]_비밀_메뉴2
#java

이 카테고리의 톡 더보기