※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2631번 문제인 줄세우기이다.
문제는 아래 링크를 확인하자.

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

 

2631번: 줄세우기

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

www.acmicpc.net

최소 몇 명을 움직여야 하는가 라는 문제 대신, 최대 몇 명을 움직이지 않아도 되는가 라는 문제를 생각해보자.

 

움직이지 않아도 되는 사람들 수는 현재 상태 그대로 있어도 줄이 제대로 서져있는, 즉 LIS를 이루고 있는 사람들을 의미한다.

 

따라서, 전체 인원 수에서 LIS의 길이를 빼주는 것으로 이 문제를 해결할 수 있다.

 

아래의 LIS 구현은 세그먼트트리를 이용한 구현이지만, DP로 구현하여도 상관없다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int seg[513];

int update(int L, int R, int qI, int qVal, int sI) {
    if (R < qI || qI < L) return seg[sI];
    if (L == R) return seg[sI] = qVal;
    return seg[sI] = max(update(L, (L + R) / 2, qI, qVal, sI * 2), update((L + R) / 2 + 1, R, qI, qVal, sI * 2 + 1));
}

int rangemax(int L, int R, int qL, int qR, int sI) {
    if (R < qL || qR < L) return 0;
    if (qL <= L && R <= qR) return seg[sI];
    return max(rangemax(L, (L + R) / 2, qL, qR, sI * 2), rangemax((L + R) / 2 + 1, R, qL, qR, sI * 2 + 1));
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int N; cin >> N;
    for (int i = 0; i < N; i++) {
        int x; cin >> x;
        int temp = rangemax(1, N, 1, x, 1);
        update(1, N, x, temp + 1, 1);
    }

    cout << N - seg[1];
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2655 // C++] 가장높은탑쌓기  (0) 2021.08.24
[BOJ 1932 // C++] 정수 삼각형  (0) 2021.08.23
[BOJ 1695 // C++] 팰린드롬 만들기  (0) 2021.08.21
[BOJ 2482 // C++] 색상환  (0) 2021.08.20
[BOJ 12970 // C++] AB  (0) 2021.08.19

+ Recent posts