알고리즘

백준 18353번 병사 배치하기 (JAVA)

박카스마시며코딩 2022. 8. 14. 21:37

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

 

18353번: 병사 배치하기

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000) 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

저는 LIS를 이용하여 문제를 해결하였습니다.

LIS를 이용하여 최장 증가 부분 수열을 구하고 이를 전체 길이에서 빼 문제를 해결하였습니다.

package BOJ.dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_18353 {
    private static final int SIZE = 10_000_000;
    private static final int NOT_VALID = 0;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int[] dp = new int[n];
        int[] input = new int[n];
        st = new StringTokenizer(br.readLine());
        for(int i = 0 ; i < n ; i++){
            dp[i] = 1;
            input[i] = stoi.apply(st.nextToken());
        }
        int result = 1;
        for(int i = n-1 ; i >= 0 ; i--){
            for(int j = i-1 ; j >= 0 ; j--){
                if(input[i] < input[j] && dp[i] + 1 > dp[j]){
                    dp[j] = dp[i] + 1;
                    result = Math.max(result,dp[j]);
                }
            }
        }
        System.out.println(n-result);

    }

}