알고리즘/백준
백준-11053번/가장 긴 증가하는 부분 수열 (java)
연향동큰손
2024. 2. 18. 18:24
우선 정수형 배열을 받아줄 배열 arr와 증가하는 수열의 길이를 나타낼 dp를 만들었다.
8
1 8 9 9 9 2 3 4
이러한 입력을 받았을때를 생각해보면 arr[5]에서 dp[5]를 arr[4]랑만 비교해서 바로 dp[5]를 1로 만들면 안되고 arr[0]과 연결되는 수열을 만들 수 있으므로 dp[5]는 2가 된다.
따라서 dp를 결정할때 앞의 수와 모두 비교를 해 줘야 한다.
i ==> 현재 비교하는 배열 요소
j ==> i의 전까지의 배열 비교
for(int i=0; i<n; i++) {
dp[i]=1;
for(int j=0; j<i; j++) {
if(arr[i]>arr[j]&&dp[i]<=dp[j]) {
dp[i]=dp[j]+1;
}
}
}
만약 arr[i]가 arr[j]보다 큰데 dp[i]보다 dp[j]가 작거나 같으면 증가되는 수열이다.
따라서 dp[i]를 dp[j]에서 1 증가시킨 값으로 넣어준다.
정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
int bigc=0;
int[] arr=new int[n];
int[] dp=new int[n];
for(int i=0; i<n; i++) {
arr[i]=scanner.nextInt();
}
for(int i=0; i<n; i++) {
dp[i]=1;
for(int j=0; j<i; j++) {
if(arr[i]>arr[j]&&dp[i]<=dp[j]) {
dp[i]=dp[j]+1;
}
}
}
int big=0;
for(int i=0; i<n; i++) {
if(dp[i]>big) {
big=dp[i];
}
}
System.out.println(big);
}
}