Ezcho

[12015] 가장 긴 증가하는 부분 수열2 본문

Algorithm/정렬

[12015] 가장 긴 증가하는 부분 수열2

Ezcho 2023. 2. 24. 22:06

 

1. 문제설명

원소의 개수와 수열을 입력받는다.

이때 수열이

10 20 10 30 20 50 이라면,

가장 긴 증가하는 부분 수열은

10 20 30 50, 즉 LIS는 4가 된다.

 

2. 코드

import java.util.Scanner;

public class Fav_long_seq {
    public static int [] FLS;
    public static int newLength = 1;
    public static void main(String args[]){
        Scanner sc  = new Scanner(System.in);
        int N = sc.nextInt();
        int [] seq = new int[N];
        int [] newSeq = new int[N];

        for(int i=0;i<N;i++){
            seq[i] = sc.nextInt();
        }
        newSeq[0] = seq[0];

        //초기세팅

        for(int i = 0; i< seq.length; i++){

            if(newSeq[newLength - 1]< seq[i]){
                newLength++;
                newSeq[newLength -1] = seq[i];
            }
            else {
               binarySearch(newSeq, seq, i);
            }
//            for(int j=0;j<newSeq.length;j++){
//                System.out.print(newSeq[j]+", ");
//            }
//            System.out.println("\n");
        }
        System.out.println(newLength);
    }

    public static void binarySearch(int[] newSeq, int[] seq, int i){
        int low = 0;
        int high = newLength;

        while (low < high) {
            int mid = (low + high) / 2;

            if (newSeq[mid] < seq[i]) {
                low = mid + 1;
            } else {
                high = mid;
            }
        }
        newSeq[low] = seq[i];
    }
}

3. 풀이

예를들어 배열이

10 20 30 15 20 25 40 일때

For문의 i 대상 값 seq newSeq BinSearch
value
newLength
1 10 10 20 30 15 20 25 40 10  x 1
2 20 10 20 30 15 20 25 40  10 20 x 2
3 30 10 20 30 15 20 25 40 10 20 30 x 3
4 15 10 20 30 15 20 25 40 10 15 30 20 -> 15 3
5 20 10 20 30 15 20 25 40 10 15 20  30 -> 20 3
6 25 10 20 30 15 20 25 40 10 15 20 25 x 4
7 40 10 20 30 15 20 25 40 10 15 20 25 40 x 5
           

위와 같이 진행된다.

Comments