-
백준 18900 (Printer's Head)전공/알고리즘 2020. 8. 8. 17:21
https://www.acmicpc.net/problem/18900
임의의 배열이 주어진다. 숫자 배열에서 가장 큰 수 부터 지울 수 있는데, 여기서 지우는 조건은 1차이나는 숫자를 한 방향으로 지우는 것이다.
만약 5 4 3 2 1
이 있다고 하면 5에서 printer을 켜서 한 번에 지울 수 있게 된다.
이때 가장 최소의 printer 작동 횟수를 구하는 문제이다.
가장 큰 것부터 차례대로 작동시키는 것이므로 배열에 해당 index를 저장시켜서 비교를 수월하게 하였다.
그리고 방향을 정해줘야 하는데 오른쪽으로 갈지 왼쪽으로 갈지를 그 다음 숫자의 위치와 지금의 위치를 비교해서 정해주었다.
마지막으로 언제까지 printer가 작동되는지 변수의 크기에 유의해서 풀면된다.
#include<iostream> using namespace std; #define MAX 1000005 int n, cnt; int arr[MAX]; bool goleft; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { int a; cin >> a; arr[a] = i; } if (n == 1) { cout << 1 << "\n"; return 0; } while (n >= 2) { if (arr[n - 1] < arr[n]) goleft = true; else goleft = false; if (goleft) { while (arr[n - 1] < arr[n]) { n--; if (n == 1)break; } n--; cnt++; } else { while (arr[n - 1] > arr[n]) { n--; if (n == 1)break; } n--; cnt++; } } if (n == 1) { cnt++; } cout << cnt << "\n"; }
'전공 > 알고리즘' 카테고리의 다른 글
백준 2252(줄 세우기) (0) 2020.09.02 백준 16207(직사각형) (0) 2020.08.08 백준 10090(Counting Inversions) (0) 2020.08.05 백준 2812(크게 만들기) (0) 2020.08.05 백준 11092(Safe Passage) (0) 2020.08.03