[백준] 11053 가장 긴 증가하는 부분수열
복습 겸 다시 한번 풀어봤다. 10분이상 생각해서 풀이 안떠오르면 바로 남의 답 보고 체득해야한다.
오답으로 가는 루트를 계속해서 개척하는건 창의성 발휘해야 하는 분들에게나 필요한거고
PS 머신 되려면 걍 무적권 체득 또 체득해야함
마치 모법답안의 풀이가 내 머릿속에서 나온것처럼 체득되어야 실전에서도 그게 나온다. 기억에서 나오면 이미 틀린거고 마치 내 생각인 양 나와야 한다.
충분히 깨닫고도 나는 또 기만에 빠져서는…. 암튼 이건 그런 문제다.
메인 아이디어는 주석에 적겠음
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));
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] arr = new int[n];
int[] len = new int[n];
for(int i = 0 ; i < n ; i++ ){
arr[i] = Integer.parseInt(st.nextToken());
// len은 기본적으로 1로 초기화한다. 아무리 짧아도 자기 자신으로 이루어진 부분수열은 있으니깐.
len[i] = 1;
}
int max = 1;
// i는 len[i]를 결정할 녀석이다. len[0]는 죽었다 깨어나도 어차피 1이므로 비교할 가치 x
for(int i = 1 ; i < n ; i++ ){
// j 는 i 보다 앞에있는 녀석들을 처음부터 쭉 훑는것임
for(int j = 0 ; j < i ; j++ ){
// 만약 j에 있는 값이 i보다 작고,
// j까지 온 부분수열의 합이 i까지 온 부분수열의 합보다 크거나 같으면
// i는 스리슬적 j가 만들어놓은 부분수열의 뒤에 합류하면 된다
if(arr[j] < arr[i] && len[j] >= len[i]){
// j가 여지껏 만들어놓은 부분수열에 슬쩍 숟가락만 얹으면 된다.
// 만일 더 좋은 조건의 j가 들어온다면 현재 for문이 돌아가는동안 알아서 교체된다
len[i] = len[j]+1;
if( len[i] > max ){
max = len[i];
}
}
}
}
System.out.println(max);
}
}
Comments