본문 바로가기

알고리즘/백준

백준 2872 - 우리집엔 도서관이 있어 c

728x90

문제 링크

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

 

2872번: 우리집엔 도서관이 있어

문제 상근이는 컴퓨터 공학의 일인자가 되기 위해 책을 매우 많이 구매했다. 하지만, 집에 책장이 없어서 책을 탑처럼 쌓아놓고 있다. 오늘은 오랜만에 상근이가 집에서 휴식을 취하는 날이다. 상근이는 책을 알파벳 순서대로 정렬하려고 한다. 사전 순으로 가장 앞서는 책은 가장 위에 놓고, 가장 뒤에 있는 책은 가장 밑에 놓아야 한다. 책을 정렬할 때 사용할 수 있는 방법은 책 하나를 뺀 다음, 가장 위에 놓는 것이다. 책은 1부터 N까지 번호가 책 이름의 사전

www.acmicpc.net

풀이 아이디어

처음엔 어떻게 풀지 좀 막막하다가, 여러 그림을 그려보고 방법을 깨닫게 되었다.

다음과 같이 책이 놓여져 있다고 치자.

3
1
4
5
2

이 경우, 2를 먼저 맨위로 올리고, 1을 그 다음에 올리면 총 2번만에 책을 12345로 정렬할 수 있다.

그 말인 즉슨, 345는 정렬이 이미 되어있다는 뜻이다.

3
1
4
5
2

이렇게 3개의 책은 정렬이 되어있다는 뜻.

즉 아래에서부터 올라오면서 제일 큰 숫자를 기준으로, 1씩 증가되는 수열의 길이를 구한다음, 총 책의 갯수에서 빼면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdio>
using namespace std;
int n, b[300001], cur;
int main() {
    scanf("%d"&n);
    for (int i = 0; i < n; i++)
        scanf("%d"&b[i]);
    cur = n;
    for (int i = n - 1; i >= 0; i--)
        if (b[i] == cur)cur--;
    cout<<cur
    return 0;
}
 
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter