본문 바로가기
알고리즘

[JAVA]백준 2631번: 줄세우기

by Kwoncorin 2021. 3. 4.
728x90

www.acmicpc.net/problem/2631

 

2631번: 줄세우기

KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기

www.acmicpc.net

1. 문제 설명

 

1번부터 N번까지의 학생들이 순서대로 있지 않을 때 번호 순서대로 만들기 위해서 학생들을 이동시키는 최소 이동 개수 구하는 문제이다.

 

2. 풀이

 

LIS 알고리즘을 이용하여 풀 수 있다.

 

이미 순서대로 있는 아이들은 옮길 필요가 없고 순서대로 있지 않은 아이들만 옮기면 되기 때문에 LIS 알고리즘을 이용하여 최장 증가 부분 수열의 길이를 구하고 총 학생 수에서 수열의 길이를 빼면 된다.

 

 

LIS 알고리즘은 이분 탐색을 이용하여 풀었는데 (O(NlogN)) 자세한 내용은 kwoncorin.tistory.com/67?category=939904 아래 문제를 참고하면 된다.

 

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int num = Integer.parseInt(br.readLine());


        int[] store = new int[num];

        int end = 1;

        store[0] = Integer.parseInt(br.readLine());

        for (int x = 1; x < num; x++) {
            int temp = Integer.parseInt(br.readLine());

            int left = 0, right = end;

            while(left<right){
                int mid = (left + right) / 2;

                if (store[mid] < temp) {
                    left = mid + 1;
                } else {
                    right = mid;
                }
            }

            store[right]=temp;

            if(right==end)
                end++;


        }

        bw.write(String.valueOf(num - end) + "\n");
        bw.flush();
        bw.close();
        br.close();
    }


}

728x90

'알고리즘' 카테고리의 다른 글

[JAVA]백준 2073번: 수도배관공사  (0) 2021.03.06
[JAVA]백준 2758번: 로또  (0) 2021.03.05
[JAVA]백준 2624번: 동전 바꿔주기  (0) 2021.03.03
[JAVA]백준 15724번: 주지수  (0) 2021.03.02
[JAVA]백준 1823번: 수확  (0) 2021.02.26