ALGORITHM

백준 1965 상자넣기 (Java)

공부하는_다온 2023. 6. 13. 22:14

1. 문제 링크

 

1965번: 상자넣기

정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

최장증가수열 개념을 그대로 쓰면 되는 기본적인 문제이다.

2번째 코드는 이진탐색을 이용한 코드이다.

 

4. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		String[] split = br.readLine().split(" ");
		int[] num = new int[N];
		int[] lis = new int[N];
		for(int i=0;i<N;i++) {
			num[i] = Integer.parseInt(split[i]);
		}
        
		int result = 0;
		for(int i=0;i<N;i++) {
			lis[i] = 1; 
			for(int j=0;j<i;j++) {
				if(num[i]>num[j] && lis[i]<lis[j]+1) {
					lis[i] = lis[j]+1;
				}
			}
			result = Math.max(result, lis[i]);
		}
		System.out.println(result);
	}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		String[] split = br.readLine().split(" ");
		int[] num = new int[N];
		int[] lis = new int[N];
		for(int i=0;i<N;i++) {
			num[i] = Integer.parseInt(split[i]);
		}
        
		int result = 0;
		for(int i=0;i<N;i++) {
			int pos = Arrays.binarySearch(lis, 0, result, num[i]);
			if(pos>=0) continue;
			
			int insert = Math.abs(pos) -1;
			lis[insert] = num[i];
			
			if(insert == result) {
				result++;
			}
		}
		System.out.println(result);
	}
}