유미의 기록들

[알고리즘 -6] 이분탐색, LIS 본문

코딩테스트 기록/알고리즘 개념

[알고리즘 -6] 이분탐색, LIS

지유미 2024. 4. 30. 20:07
728x90
반응형

이분탐색 (Binary Search)

오름차순으로 정렬되어 있는 리스트에서 같은 크기의 두 부분으로 나누고 필요한 부분에서만 탐색하도록 제한하여 원하는 데이터를 찾는 알고리즘

 

1. 정렬된 배열의 중간요소와 어떠한 대상 값을 비교한다

2. 그 요소가 아닌 경우 절반을 제거하고 나머지 절반에서 검색을 반복한다

    2-1. 그 요소가 중간요소보다 작을 경우, 왼쪽으로 다시 탐색

    2-2. 그 요소가 중간요소보다 클 경우, 오른쪽으로 다시 탐색

 

 

이렇게 정렬된 배열에서 중간값이 어떠한 대상 값보다 큰지, 작은지 비교하고 탐색 범위를 반으로 나누기 때문에 시간복잡도는 logN이다. 

 

 

v배열에서 찾는 값이 n일때 코드이다

while(l <= r){
    mid = (l + r) / 2; 
    if(v[mid] > n) r = mid - 1; 
    else if(v[mid] == n) return 1;
    else l = mid + 1; 
}

 

📌 이분탐색 알고리즘 문제

https://www.acmicpc.net/problem/2792 

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

public class Main{
	static int n,m;
	static int nList[],mList[];
    
	static int search(int num){
		int l=0; int r=n-1;
		int check=0;
		
		while(l<=r){
			int mid=(l+r)/2;
			if(nList[mid]==num){
				check=1;
				return check;
			}else if(nList[mid]>num){
				r=mid-1;
			}else{
				l=mid+1;
			}
		}
		return check;
	}
	public static void main(String[]args) throws IOException{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		int T;
		
		T=Integer.parseInt(br.readLine());
		
	
		for(int test_case=0;test_case<T;test_case++){
			//입력
			n=Integer.parseInt(br.readLine());
			nList=new int[n];
			st=new StringTokenizer(br.readLine());
			for(int i=0;i<n;i++){
				nList[i]=Integer.parseInt(st.nextToken());
			}
			
			m=Integer.parseInt(br.readLine());
			mList=new int[m];
			st=new StringTokenizer(br.readLine());
			for(int i=0;i<m;i++){
				mList[i]=Integer.parseInt(st.nextToken());
			}
			
			//정렬
			Arrays.sort(nList);
			
			//이분탐색
			for(int i=0;i<m;i++){
				bw.write(Integer.toString(search(mList[i])));
				bw.write('\n');
			}
			bw.flush();
		}
	}
	
}

 

 

 

LIS (Longestr Increase Sequence), 최장 증가 부분 수열

어떤 수열에서 일부 원소를 골라서 만들 수 있는 수열 중에서, 길이가 최대이면서 오름차순을 유지하는 수열

 

 

📌 LIS 문제

https://www.acmicpc.net/problem/11053

 

 

 

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

public class Main{
	public static void main(String[]args) throws IOException{
		Scanner sc=new Scanner(System.in);
		int ret=0;
		int n;
		int a[],cnt[];
		n=sc.nextInt();
		
		a=new int[n];
		cnt=new int[n];
		
		for(int i=0;i<n;i++){
			a[i]=sc.nextInt();
		}
		for(int i=0;i<n;i++){
			int maxValue=0;
			for(int j=0;j<i;j++){
				if(a[j]<a[i] && maxValue<cnt[j]){
					maxValue=cnt[j];
				}
			}
			cnt[i]=maxValue+1;
			ret=Math.max(ret,cnt[i]);
		}
		System.out.println(ret);
	}
}
728x90
반응형
Comments