Algorithm
[Algo] 백준 2872 우리집엔 도서관이 있어
조핑구
2024. 6. 10. 17:04
문제 바로가기 : https://www.acmicpc.net/problem/2872
메모리 : 32780 KB
시간 : 292 ms
언어 : Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
int idx = 0;
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(br.readLine());
if (arr[i] == N)
idx = i;
}
int cnt = 1;
int tmp = N - 1;
idx -= 1;
for (int i = idx; i >= 0; i--) {
// 내림차순인지 검사
if (arr[i] == tmp) {
cnt++;
tmp--;
}
}
System.out.println(N - cnt);
}
}
풀이
책이 30만권이기 때문에 구현하는 문제는 아니다. 배열을 한 번 돌면서 답을 찾을 수 있으면 최적의 풀이일 것이다. = 그리디구나!
책은 뽑아서 위로 올리는 행동밖에 할 수 없기 때문에 어떤 책을 뽑아야하는지만 결정하면 된다. 뽑아야 할 책임이 명확해지면 순서는 알아서 잘 조정할 수 있기 때문에 뽑는 순서는 고려하지 않아도 된다. 가장 밑바닥에 깔릴 책(가장 큰 수) 밑에있는 책은 모두 뽑아야하고, 그 위에 있는 책이라고 해도 순서대로 배치되어있다면 그 사이의 책이 뽑히면서 결국 정렬이 완성된다. 따라서 N, N-1, N-2... 순서로 책이 배치되어있다면 그 책은 뽑지 않아도 된다.
N의 index에서 시작해 내림차순의 책들을 골라주고, 전체 개수에서 빼면 정답이 나온다.