본문 바로가기

ALGORITHM

백준 1965 상자넣기 (Java)

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);
	}
}

'ALGORITHM' 카테고리의 다른 글

백준 2166 다각형의 면적 (Java)  (0) 2023.06.15
백준 14620 꽃길 (Java)  (0) 2023.06.14
백준 3187 양치기 꿍 (Java)  (0) 2023.06.12
백준 16139 인간-컴퓨터 상호작용  (0) 2023.06.11
백준 15685 드래곤 커브 (Java)  (0) 2023.06.10