백준/이분탐색

1365 꼬인 전깃줄

have a good time 2024. 7. 25. 22:30

 

 

이 문제는 가장 긴 증가하는 부분 수열 문제와 풀이법이 같다.

 

참고 :

https://happy-fun.tistory.com/207

 

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

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = n

happy-fun.tistory.com

 

그래서 이 방법으로 문제를 풀면 된다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	
    public static void main(String[] args)  throws IOException {
  
    	
    	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           StringTokenizer st = new StringTokenizer(br.readLine(), " ");
       	   int N = Integer.parseInt(st.nextToken());
           
       	   int input[] = new int[N];
		
       	   st = new StringTokenizer(br.readLine(), " ");
		   for(int i=0; i<N; i++) {
				input[i] = Integer.parseInt(st.nextToken());
		    }
			
			
		   ArrayList<Integer> list = new ArrayList<>();
		   list.add(0);
			
		   for(int i=0; i<N; i++) {
		   int value = input[i];
				
		   if(list.get(list.size()-1) < value) {
					
					list.add(value);					
					
			}else {
					
				
				int left = 1;
				int right = list.size()-1;
					
				while(left<right) {
					int mid = (left+right)/2;
					
					if(list.get(mid)<value) {
						left = mid +1;
					}else {
						right = mid;
					}
				 }
					
					list.set(right, value);
			 }
			}
			
			
			System.out.println(N-(list.size()-1));
    }
}