본문 바로가기
코딩테스트 준비/백준

[백준] 7570번 - 줄 세우기 [Java]

by mwzz6 2025. 3. 4.

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

 

[백준] 7570번 - 줄 세우기 [Java]
[백준] 7570번 - 줄 세우기 [Java]


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. 후기