본문 바로가기
ps

[백준] 7570 - 줄 세우기

by kariskan 2022. 7. 25.

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

 

7570번: 줄 세우기

입력은 2 개의 줄로 이루어져 있다. 첫 줄에는 어린이 수를 나타내는 정수가 주어진다. 둘째 줄에는 처음에 줄서있는 어린이들의 번호가 차례대로 주어진다. 주어진 번호들 사이에는 공백이 하

www.acmicpc.net

 

해결 방법이 떠오르지 않아 다른 블로그를 참고하였다.

 

핵심은 LIS(Longest Increasing Subsequence)였다. 주어지는 수열의 LIS를 찾고, 총길이 - LIS의 길이가 답이다.

하지만 보통의 LIS가 아니고 연속적인 숫자를 가진 LIS를 찾아야 한다.

 

LIS를 찾는 과정은 index 배열을 이용해 현재 수의 이전 수가 앞에 나온 적이 있는가 없는가로 판단해 구하였다.

 

#include <iostream>
using namespace std;

int idx[1000001];
int a[1000001];
int dp[1000001];
int n;
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		idx[a[i]] = i;
	}
	int ans = 1;
	dp[1] = 1;
	for (int i = 2; i <= n; i++) {
		if (idx[i] > idx[i - 1]) {
			dp[i] = dp[i - 1] + 1;
		}
		else dp[i] = 1;
		ans = max(ans, dp[i]);
	}
	cout << n - ans;
}

 

Reference

https://mygumi.tistory.com/276

'ps' 카테고리의 다른 글

[백준] 1285 - 동전 뒤집기  (0) 2022.07.26
[백준] 2613 - 숫자구슬  (0) 2022.07.26
[백준] 2873 - 롤러코스터  (0) 2022.07.25
[백준] 8980 - 택배  (0) 2022.07.19
[백준] 1744 - 수 묶기  (0) 2022.07.19

댓글