SSONG Cloud
[백준] 2631 줄세우기 본문
반응형
문제 출처: 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