https://www.acmicpc.net/problem/2812
이 문제는 전형 적인 그리디 문제이다 그리디 문제의 특징은 모든 과정에서의 답이아니기 때문에 풀 수 있다
이문제는 일단 주의 할점을 일반적으로 input을 받으면 int 형자료형은 50만자리의 수를 받을 수없기 때문에 string으로 input을 받아 사용하는게 좋다
또한 이문제는 스택을 두고 이전에 들어온 값들보다 현재 들어오는 값들을 뽑고 거기에 넣으면서 뽑은 횟수를 저장해야한다 그래서 만약에 최대 뽑기수보다 못뽑으면 그냥 그상태로 값이 나온다
#include<iostream>
#include<stack>
#include<vector>
#include <algorithm>
using namespace std;
stack<long long> bigStack;
stack<long long> answerStack;
long long n, k;
string num;
vector<long long> arr;
long long popCount=0;
long long result = 0;
int main() {
cin >> n >> k;
cin >> num;
for (int i = 0; i < num.length(); ++i) {
arr.push_back(num[i] - '0'); // 문자 '0'을 빼서 실제 숫자로 변환
}
if(arr.size()!=0)
bigStack.push(arr[0]);
for (long long i = 1; i < n; i++) {
while (!bigStack.empty()&& bigStack.top() < arr[i] && popCount<k) {
bigStack.pop();
popCount += 1;
}
bigStack.push(arr[i]);
}
while (popCount < k) {
bigStack.pop();
popCount += 1;
}
while (!bigStack.empty()) {
answerStack.push(bigStack.top());
bigStack.pop();
}
while (!answerStack.empty()) {
cout << answerStack.top();
answerStack.pop();
}
}