-
[Baekjoon Online Judge] 11053번: 가장 긴 증가하는 부분 수열문제 풀이/Baekjoon Online Judge 2021. 2. 6. 14:57
요구사항
- 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구한다.
입력
- 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
- 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
- 첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
수열의 각 항목을 비교하며, 해당 자리 까지 가장 긴 증가하는 부분 수열을 찾아 dp 테이블에 저장한다.
sequence 10 20 10 30 20 50 dp 1 sequence 10 20 10 30 20 50 dp 1 2 20의 경우 10 보다 크기 때문에 20 이전 까지 가장 긴 증가하는 부분 수열의 길이인 1에서 자신까지 +1을 하여 2를 저장한다.
sequence 10 20 10 30 20 50 dp 1 2 1 10의 경우 자신보다 작은 크기의 수열이 없기 때문에 자신만을 가진 부분 수열의 길이인 1을 저장한다.
sequence 10 20 10 30 20 50 dp 1 2 1 3 30의 경우 이전 수열 까지의 가장 긴 부분 수열의 길이 2에서 자신까지 +1을 하여 3을 저장한다.
sequence 10 20 10 30 20 50 dp 1 2 1 3 2 sequence 10 20 10 30 20 50 dp 1 2 1 3 2 4 마지막 수열까지 반복하면 dp 테이블을 모두 찾을 수 있었다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Baekjoon11053 { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(bufferedReader.readLine()); StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine(), " "); int[] sequence = new int[n]; int[] dp = new int[n]; for (int i = 0; i < sequence.length; i++) sequence[i] = Integer.parseInt(stringTokenizer.nextToken()); for (int i = 0; i < n; i++) { dp[i] = 1; for (int j = 0; j < i; j++) { if (sequence[i] > sequence[j] && dp[i] <= dp[j]) dp[i] = dp[j] + 1; } } int max = 0; for (int i : dp) max = Math.max(max, i); System.out.println(max); bufferedReader.close(); } }
마지막으로 가장 긴 부분 수열을 출력하기 위해서 dp 테이블에 저장된 부분 수열 길이 중 가장 큰 값을 찾아 출력한다.
'문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon Online Judge] 10870번: 피보나치 수 5 (0) 2021.02.06 [Baekjoon Online Judge] 1912번: 연속합 (0) 2021.02.06 [Baekjoon Online Judge] 1212번: 8진수 2진수 (0) 2021.02.05 [Baekjoon Online Judge] 11656번: 접미사 배열 (0) 2021.02.05 [Baekjoon Online Judge] 10988번: 팰린드롬인지 확인하기 (0) 2021.02.05