https://www.acmicpc.net/problem/2812
2812번: 크게 만들기
N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
숫자는 자리수가 큰 쪽이 숫자의 대소를 결정하기 때문에
자리수가 큰 쪽에 큰 수가 오게 숫자를 최대한 내림차순으로 만들어 준다.
#include<bits/stdc++.h>
using namespace std;
stack<char> stk; //스택을 이용해 답을 구한다.
vector<char> ans; //역으로 출력하기 위해 답 저장
int main(){
int n,k; cin>>n>>k;
string num; cin>>num;
for(int i=0; i<n; i++){
// 스택이 비어있거나
//숫자를 다 지웠을때
if(k == 0 || stk.empty())
stk.push(num[i]);
else{
// 이전 숫자가 현재 숫자보다 작을때
// 내림차순으로 만들기 위해 제거
if(stk.top() < num[i]){
char tmp = num[i];
// 내림차순이 될 때까지 제거
while(!stk.empty() && stk.top() < tmp && k != 0){
k--;
stk.pop();
}
stk.push(num[i]);
}
else if(stk.top() >= num[i]) // 이미 내림차순일때 스택에 넣기
stk.push(num[i]);
}
}
// 출력
while(!stk.empty()){
ans.push_back(stk.top());
stk.pop();
}
for(int i=ans.size()-1; i>=k; i--) cout << ans[i];
return 0;
}
'문제 풀이' 카테고리의 다른 글
[c++] (AtCoder Beginner Contest 295) D - Three Days Ago (0) | 2023.04.16 |
---|---|
[c++] 백준 2109 순회 강연 (0) | 2023.04.14 |
[c++] 백준 17404 RGB거리 2 (0) | 2023.03.23 |
[c++] 백준 13398 연속합 2 (0) | 2023.03.22 |
[c++] 백준 15988 1, 2, 3 더하기 3 (0) | 2023.03.20 |