1 λΆ„ μ†Œμš”

πŸ“ [D3_3307] 졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄

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

public class Solution {
	static StringTokenizer st;
	static int[] arr;
	static int[] dp;
	static int min, N;
	static int idx;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int T = Integer.parseInt(br.readLine());
		
		for(int tc=1; tc<=T; tc++) {
			sb.append("#").append(tc).append(" ");
			
			// μˆ˜μ—΄μ˜ 길이
			N = Integer.parseInt(br.readLine());
			
			// 숫자 λ°°μ—΄
			arr = new int[N];
			// dp κ°’ μ €μž₯ λ°°μ—΄
			dp = new int[N];
			
			st = new StringTokenizer(br.readLine(), " ");
			for(int i=0; i<N; i++) {
				arr[i] = Integer.parseInt(st.nextToken());
			}
			
			// μ΄ˆκΈ°κ°’ μ„€μ •
			dp[0] = arr[0];
			
			idx = 0;
			
			LIS();
			
			sb.append(idx+1).append("\n");
		}
		System.out.println(sb);
	}
	
	// LIS
	static void LIS() {
		
		for(int i=1; i<N; i++) {
			
			// arr 값이 더 큰 경우 
			if(arr[i] > dp[idx]) {
				idx++;
				dp[idx] = arr[i];
			}
			
			// dp 값이 더 큰 경우
			else {
				int low = bs(idx, arr[i]); 
				dp[low] = arr[i];
			}
		}
	}
	
	// 이진 탐색
	static int bs(int end, int n) {
		int start = 0;
		
		while(start < end) {
			int mid = ( start + end ) / 2;
			
			if(dp[mid] >= n) {
				end = mid;
			}
			else {
				start = mid+1;
			}
		}
		return end;
	}
}

πŸ€” λ‚˜μ˜ 생각

이 λ¬Έμ œλŠ” LIS의 μ „ν˜•μ μΈ λ¬Έμ œμ΄λ‹€.
λ‚˜λŠ” dp와 이진 탐색을 톡해 문제λ₯Ό ν•΄κ²°ν•˜μ˜€λ‹€.
LIS μ„€λͺ