SSONG Cloud

[백준] 2631 줄세우기 본문

Algorithm/백준

[백준] 2631 줄세우기

SSONGMI 2021. 6. 5. 18:57
반응형

문제 출처: https://www.acmicpc.net/submit/2631/29755841

 

로그인

 

www.acmicpc.net

 

1. 입력

: 첫째 줄에는 아이들의 수 N이 주어진다.

: 둘째 줄부터는 1부터 N까지의 숫자가 한 줄에 하나씩 주어진다.

: N은 2 이상 200 이하의 정수이다.

 

2. 출력

: 첫째 줄에는 번호 순서대로 줄을 세우는데 옮겨지는 아이들의 최소 수를 출력한다.

 

3. 풀이

: 줄을 세우는데 옮겨지는 아이들의 최소 수를 구해야 한다.

: 처음에는 어떻게 하면 번호가 순서대로 될지 고민해 볼 수 있다.

: 가장 효율적인 방법은 기존에 순서대로 있는 아이들은 두고 올바른 순서가 아닌 아이들만 옮기는 것이다.

: 올바른 순서대로 있는 아이들의 수를 최대로 해야 한다.

: 따라서 LIS(최장 증가 부분 수열)를 생각해볼 수 있다.

: 최장 증가 부분 수열의 크기를 구하고 이들을 제외한 나머지 아이들만 순서를 옮기도록 하면 된다.

 

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

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer st;
	public static void main(String[] args) throws NumberFormatException, IOException {
		int N = Integer.parseInt(br.readLine());
		
		int[] arr = new int[N];
		int[] dp = new int[N];
		
		for(int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		
		int size = 0;
		for(int i = 0; i < N; i++) {
			int idx = Arrays.binarySearch(dp, 0, size, arr[i]);
			if(idx < 0) idx = Math.abs(idx) -1;
			dp[idx] = arr[i];
			if(idx == size) size++;
		}
		System.out.println(N-size);
		
	}
}
반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준] 1068 트리  (0) 2021.06.09
[백준] 9507 Generations of Tribbles  (0) 2021.06.05
[백준] 14916 거스름돈  (0) 2021.06.05
[백준] 16395 파스칼의 삼각형  (0) 2021.06.05
[백준] 2+1 세일  (0) 2021.05.28
Comments