2812번: 크게 만들기
문제 N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N과 K가 주어진다. (1 ≤ K < N ≤ 500,000) 둘째 줄에 N자리 숫자
www.acmicpc.net
입력받은 숫자의 순서를 바꿀 수 없기 때문에 앞에서부터 탐색하여 K가 0이 되기 전까지 가능한 큰 숫자가 앞에 위치하도록 숫자를 지우는 것이 이 문제의 핵심이었다.
입력받은 숫자를 앞에서부터 컨테이너에 담으면서 만약 K가 1이상이고, 앞에 먼저 담은 숫자가 현재 담을 숫자보다 작을 경우 K를 1 감소시키면서 컨테이너에 담긴 숫자를 제거하는 방법으로 구현하였다.
담을 때는 LIFO 방식이 필요하지만, 출력할 때는 FIFO 방식이 필요하므로 deque 컨테이너를 사용하였다.
#include <iostream>
#include <string>
#include <deque>
using namespace std;
void Greedy(string& number, int N, int K)
{
deque<char> dq;
for (int i = 0; i < N; i++)
{
while (!dq.empty() && K != 0 && dq.back() < number[i])
{
dq.pop_back();
K--;
}
dq.push_back(number[i]);
}
while (K--)
dq.pop_back();
while (!dq.empty())
{
cout << dq.front();
dq.pop_front();
}
}
int main(void)
{
ios_base::sync_with_stdio(0);
int N, K;
cin >> N >> K;
string number;
cin >> number;
Greedy(number, N, K);
return 0;
}

알고리즘 200일 프로젝트 - 129 day
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1041번: 주사위 (0) | 2020.08.17 |
---|---|
백준 1439번: 뒤집기 (0) | 2020.08.17 |
백준 9576번: 책 나눠주기 (0) | 2020.08.15 |
백준 3109번: 빵집 (0) | 2020.08.13 |
백준 1507번: 궁금한 민호 (0) | 2020.08.12 |