문제링크
2872번: 우리집엔 도서관이 있어
상근이는 컴퓨터 공학의 일인자가 되기 위해 책을 매우 많이 구매했다. 하지만, 집에 책장이 없어서 책을 탑처럼 쌓아놓고 있다. 오늘은 오랜만에 상근이가 집에서 휴식을 취하는 날이다. 상근
www.acmicpc.net
문제
상근이는 컴퓨터 공학의 일인자가 되기 위해 책을 매우 많이 구매했다. 하지만, 집에 책장이 없어서 책을 탑처럼 쌓아놓고 있다.
오늘은 오랜만에 상근이가 집에서 휴식을 취하는 날이다. 상근이는 책을 알파벳 순서대로 정렬하려고 한다. 사전 순으로 가장 앞서는 책은 가장 위에 놓고, 가장 뒤에 있는 책은 가장 밑에 놓아야 한다. 책을 정렬할 때 사용할 수 있는 방법은 책 하나를 뺀 다음, 가장 위에 놓는 것이다.
책은 1부터 N까지 번호가 책 이름의 사전 순으로 매겨져 있다. 1은 사전 순으로 가장 앞서는 책이다. 따라서, 위에서부터 책의 번호를 읽으면 (1, 2, ..., N)이 되어야 한다. 예를 들어, 책이 3권있고 처음에 (3, 2, 1)로 쌓여있을 때, 2번 만에 사전순으로 책을 쌓을 수 있다. 가장 먼저, 2번 책을 뺀 다음에 가장 위에 놓는다. 그렇게 되면 (2, 3, 1)이 된다. 마지막으로, 1을 뺀 다음 가장 위에 놓으면 (1, 2, 3)이 된다.
현재 책이 어떻게 쌓여있는지가 주어졌을 때, 몇 번만에 사전 순으로 쌓을 수 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 책의 개수 N이 주어진다. (N ≤ 300,000)
다음 N개 줄에는 가장 위에 있는 책부터 아래에 있는 책까지 순서대로 주어진다.
출력
첫째 줄에 몇 번만에 책을 정렬할 수 있는지 출력한다.
풀이
주어진 상태에서 정렬하기 위한 방법을 찾아야한다.
내가 찾은 방법은 밑에서부터 큰 번호가 내림차순으로 되어있는 책의 수를 전체 책의 수에서 빼주면 되는데 말로 설명하면 이해하기 어렵기 때문에 간단한 예를 들어 설명해보겠다.
현재 8권의 책이 있고
(위)3 4 7 2 6 1 5 8(아래) 순서대로 되어 있다고 가정하자.
위의 내용에 따르면 8과 7은 이미 내림차순으로 정렬되어 있다. 따라서 8번 책과 7번책은 꺼낼 필요가 없고, 6번부터 5, 4, 3, 2, 1번 책 순서대로 꺼내서 다시 끼워 넣으면 순서대로 정렬이 될 것이다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#include <iostream>
#include <vector>
using namespace std;
int n;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
vector<int> books(n);
// input
for (int i = 0; i < n; i++) {
cin >> books[i];
}
// the number of resort book
int result = n;
for (int i = n - 1; i >= 0; i--) {
if (books[i] == result) {
result--;
}
}
cout << result;
}
|
cs |