본문 바로가기

12015 가장 긴 증가하는 부분 수열 2 (java)

2020. 6. 11.

해결 방법

 

1. 이분탐색으로 수열을 만들어 나가며 답을 도출한다.

2. 이분 탐색 종류 중 LowerBound를 이용하여 인덱스를 탐색한다.

 

알고리즘

 

1.vector에 데이터가 없으면 삽입한다.

2.vector의 최대값보다 크면 삽입한다.

3.vector의 최대값보다 작으면 LowerBound를 이용해 인덱스를 찾고, 그 값을 교체해준다.

 

예시

{10, 1, 2, 20, 40, 5 }

 

1) vector = {10}

2) vector = {1}

3) vector = {1, 2}

4) vector = {1, 2, 20}

4) vector = {1, 2, 20, 40}

4) vector = {1, 5, 20, 40}

 

나의 문제점

 

LowerBound 구현이 완벽하지 않아서 인덱스 값을 잘못 가져왔고 런타임 에러가 발생했다.

 

LowerBound : value 값 보다 크거나 같은 값 중 첫 번째 인덱스를 찾는 알고리즘

 

ex ) [1, 1, 3, 4, 5, 5, 7, 7, 9]

 

value => 6 의 LowerBound 결과 index = 6

value => 5 의 LowerBound 결과 index = 5

 

구현 코드

import java.io.IOException;
import java.util.*;

public class Main {
	static Vector<Integer> vector;

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		vector = new Vector<>();
		int N = sc.nextInt();

		for(int i=0; i<N; i++) {
			int value = sc.nextInt();
			int maxIndex = vector.size();
			
			if(maxIndex == 0 || vector.elementAt(maxIndex - 1) < value) {
				vector.add(value);
			}
			else binarySearch(value);
		}
		
		System.out.println(vector.size());
	}
	
	public static void binarySearch(int insertValue) {
		int index = lowerBound(insertValue);
		
		vector.remove(index);
		vector.add(index, insertValue);		
		
	}
	public static int lowerBound(int insertValue) {
		int start = 0;
		int end = vector.size() - 1;
		
		while(start <= end) {
			int mid = (start + end) / 2;
			
			if(vector.elementAt(mid) < insertValue) {
				start = mid + 1;
			}
			else {
				end = mid - 1;
			}
			
		}
		return start;
	}
	
}

 

'Python > 이분탐색' 카테고리의 다른 글

1300 K 번째 수 (java)  (0) 2020.06.10
댓글