https://www.acmicpc.net/problem/2812
<코드>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
bool check;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, k;
cin>>n>>k;
vector<char>v; //기존 입력 값 숫자
vector<char>v2;//변경된 결과 값 숫자
string num;
cin>>num;
for(int i=0;i<n;i++){
v.push_back(num[i]);
}
int i=0;
for(i=0;i<num.size();i++){
while(k && !v2.empty() && v2.back()<v[i]){
v2.pop_back();
k--;
} // 숫자 k개 제거 및 조건문(벡터 v2의 뒷 부분이 v[i]보다 작다면 pop해주고 큰 수를 넣어줘야 된다)
v2.push_back(v[i]);
}
while(k--){
v2.pop_back(); // 숫자 k개를 제거하지 못했다면, pop해준다(ex)1111과 같은 중복된 수를 고려)
}
for(int i=0;i<v2.size();i++)
{
cout<<v2[i];
}
}
<풀이과정>
이 문제의 핵심은 숫자 문자열의 순서는 그대로여야 하며, 기존 벡터(입력)와 새로운 벡터(결과)의 비교를 통해 큰 수를 만드는 것이 핵심이다.
'PS > 그리디 알고리즘[Greedy]' 카테고리의 다른 글
백준 19941 햄버거 분배 (0) | 2022.07.03 |
---|---|
백준 1449 수리공 항승 (0) | 2022.07.01 |
백준 18310 안테나 (0) | 2022.06.30 |
백준 2012 등수매기기 (0) | 2022.06.30 |
백준 9009 피보나치 (0) | 2022.06.29 |