[BaekJoon] 14002 가장 긴 증가하는 부분 수열 4 (Java)

오태호·2022년 10월 25일
0

백준 알고리즘

목록 보기
83/395

1.  문제 링크

https://www.acmicpc.net/problem/14002

2.  문제

요약

  • 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 문제입니다.
  • 입력: 첫 번째 줄에 1보다 크거나 같고 1,000보다 작거나 같은 수열 A의 크기 N이 주어지고 두 번째 줄에 1보다 크거나 같고 1,000보다 작거나 같은 수열 A를 이루고 있는 AiA_i가 주어집니다.
  • 출력: 첫 번째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력하고 두 번째 줄에 가장 긴 증가하는 부분 수열을 출력합니다. 만약 그러한 수열이 여러가지인 경우 아무거나 출력합니다.

3.  소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	static StringBuilder sb = new StringBuilder();
	static int N;
	static int[] A;
	static void input() {
		Reader scanner = new Reader();
		N = scanner.nextInt();
		A = new int[N];
		for(int index = 0; index < N; index++) A[index] = scanner.nextInt();
	}
	
	static void solution() {
		int[] dp = new int[N];
		dp[0] = 1;
		int result = 1;
		for(int count = 1; count < N; count++) {
			dp[count] = 1;
			for(int index = 0; index < count; index++) {
				if(A[count] > A[index]) {
					dp[count] = Math.max(dp[count], dp[index] + 1);
					result = Math.max(result, dp[count]);
				}
			}
		}
		sb.append(result).append('\n');
		Stack<Integer> stack = new Stack<>();
		for(int index = N - 1; index >= 0; index--) {
			if(dp[index] == result) {
				stack.push(A[index]);
				result--;
			}
		}
		while(!stack.isEmpty()) sb.append(stack.pop()).append(' ');
		System.out.println(sb);
	}
	
	public static void main(String[] args) {
		input();
		solution();
	}
	
	static class Reader {
		BufferedReader br;
		StringTokenizer st;
		public Reader() {
			br = new BufferedReader(new InputStreamReader(System.in));
		}
		String next() {
			while(st == null || !st.hasMoreElements()) {
				try {
					st = new StringTokenizer(br.readLine());
				} catch(IOException e) {
					e.printStackTrace();
				}
			}
			return st.nextToken();
		}
		int nextInt() {
			return Integer.parseInt(next());
		}
	}
}
profile
자바, 웹 개발을 열심히 공부하고 있습니다!

0개의 댓글