1. 문제

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

 

2631번: 줄세우기

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

www.acmicpc.net

2. 접근방법

가장 적은 수의 이동으로 정렬 상태를 만드는 문제

 

가장 적은 수만 이동시켜 정렬을 시키기 위해선

가장 많이 정렬된 상태의 인원들을 찾아 그 이외의 사람들만 이동시키면 된다.

 

가장 많이 정렬된 상태? -> 가장 긴 정렬 상태? -> 최장 증가 수열 !

 

그렇다 LIS(Longest Incerasing Subsequence)를 구하는 문제였다.

 

LIS를 구하는 방법으로 내가 아는 것은 dp와 이분탐색이 있는데

N의 크기가 200밖에 되지 않으니 N^2으로 충분히 풀이가능하여 dp를 활용하였다.

 

LIS를 구한 뒤 자리를 옮기는 인원의 수를 구해야 하므로

전체인원에서 정렬된 인원의 수를 뺀 값을 출력하면 된다.

3. 자바 코드

package Gold;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class G5_2631줄세우기 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int arr[] = new int[N];
		for (int i = 0; i < N; i++)
			arr[i] = Integer.parseInt(br.readLine());
		int dp[] = new int[N];
		int max = 0;
		for (int i = 0; i < N; i++) {
			for (int j = i - 1; j >= 0; j--)
				if (arr[j] < arr[i])
					dp[i] = Math.max(dp[j] + 1, dp[i]);
			max = Math.max(dp[i], max);
		}
		System.out.println(N - max);
	}
}

4. 마치며

LIS를 한번이라도 접해 봤다면 빠르게 풀이 가능한 문제 같다.

 

 

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준] 2624 동전 바꿔주기  (2) 2021.11.30
[백준] 1715 카드 정렬하기  (0) 2021.11.26
[백준] 5557 1학년  (0) 2021.11.23
[백준] 1726 로봇  (0) 2021.11.20
[백준] 9084 동전  (0) 2021.11.09

+ Recent posts