https://www.acmicpc.net/problem/11053
import java.util.*;
import java.io.*;
public class Main {
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuilder sb=new StringBuilder();
public static void main(String args[]) throws Exception {
int iter=Integer.parseInt(br.readLine());
int[] num=new int[iter];
int[] cnt=new int[iter];
String str[]=br.readLine().split(" ");
for(int i=0;i<iter;i++) {
num[i]=Integer.parseInt(str[i]);
}
for(int i=0;i<iter;i++) {
cnt[i]=1;
for(int j=0;j<i;j++) {
if(num[i]>num[j]&&cnt[i]<=cnt[j]) cnt[i]=cnt[j]+1;
}
}
int max=0;
for(int i:cnt) {
max=Math.max(max, i);
}
bw.write(max+"\n");
bw.flush();
bw.close();
}
}
num 배열에는 수열을 순서대로 저장합니다.
cnt 배열에는 증가하는 부분수열의 길이를 저장합니다.
문제에서 예시로 든 10 20 10 30 20 50 을 예로 들어보겠습니다.
여기서 가장 긴 부분 수열은 10 20 30 50 으로 이루어진 길이가 4인 부분 수열입니다.
이 부분 수열은 10 20 30으로 이루어진 길이가 3인 부분 수열에 +1을 한 것이고, 10 20 30으로 이루어진 부분 수열은 10 20 으로 이루어진 길이가 2인 부분수열에 +1을 한 것입니다.
이 로직을 사용한 게 중간에 이중 for문으로 되어 있는 부분입니다.
현재 인덱스인 i의 num[i]보다 num[j]가 작고, 즉 수열의 숫자값이 더 작지만, j 번째 부분 수열의 길이가 i 번째 부분 수열의 길이보다 길 때 cnt[i]=cnt[j]+1로 해주어서 부분 수열을 연장해주었습니다.
'프로그래밍 문제 > BOJ(백준 온라인 저지)' 카테고리의 다른 글
[BOJ 12865번] 평범한 배낭(JAVA) (0) | 2020.08.08 |
---|---|
[BOJ 2565번] 전깃줄(JAVA) (0) | 2020.08.05 |
[BOJ 1463번] 1로 만들기(JAVA) (0) | 2020.08.04 |
[BOJ 9461번] 파도반 수열(JAVA) (0) | 2020.08.04 |
[BOJ 1904번] 01 타일(JAVA) (0) | 2020.08.02 |