https://www.acmicpc.net/problem/7570


1. 아이디어
가장 긴 연속하며 증가하는 번호로 이루어진 부분 수열을 구하고 수열에 해당하지 않는 번호를 적절하게 앞 뒤로 이동시키는 그리디 알고리즘과 다이나믹 프로그래밍으로 해결할 수 있다.
2. 문제풀이
dp 배열을 먼저 선언했고 dp 배열은 인덱스에 해당하는 숫자로 끝나는 가장 긴 연속하며 증가하는 부분 수열의 길이를 저장한다.
점화식은 dp[idx] = dp[idx-1] + 1 로 연속해야하므로 해당 숫자보다 1 작은 숫자로 끝나는 가장 긴 연속하며 증가하는 부분 수열의 길이 + 1을 해주면 된다.
3. 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
// 연속하는 수로 이루어진 LIS의 길이를 저장
int[] dp = new int[1 + N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(st.nextToken());
dp[num] = dp[num - 1] + 1;
}
int len = 0;
for (int i = 1; i <= N; i++) {
len = Math.max(len, dp[i]);
}
System.out.println(N - len);
}
}
4. 후기

'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 11000번 - 강의실 배정 [Java] (1) | 2025.03.06 |
---|---|
[백준] 2457번 - 공주님의 정원 [Java] (0) | 2025.03.05 |
[백준] 1744번 - 수 묶기 [Java] (0) | 2025.03.04 |
[백준] 32951번 - AI 선도대학 [Java] (1) | 2025.03.03 |
[백준] 25370번 - 카드 숫자 곱의 경우의 수 [Java] (0) | 2025.03.03 |