GitHubSeob
C++ / 백준 / 2812 / 크게 만들기 본문
문제 |
https://acmicpc.net/problem/2812
2812번: 크게 만들기
N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제풀이 |
우선순위큐로도 풀 수 있는 거 같은데 스택이 코드가 더 간단해 보여서 스택으로 풀었다.
이 문제는 뒤로 가면서 큰 숫자를 발견하면 이전 숫자를 지우기만 하면 된다.
스택을 이용해 숫자를 push 하고, 큰 수가 나온다면, 스택이 비거나 스택의 top과 같을 때까지 pop을 하면 된다.
또는 지운 개수가 K개까지만 반복하면 된다.
입력받은 문자열을 모두 탐색했으면, K개를 안 지운 경우도 있을 수 있으니, while문을 이용해 추가로 지워준다.
스택에는 똑바로 쌓여있지만 후입선출이므로, string으로 옮기고 reverse 하여 답을 출력한다.
코드 |
#include <iostream>
#include <stack>
#include <string>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N(0), K(0), idx(0), cnt(0);
string num(""), answer("");
stack<char>s;
cin >> N >> K >> num;
for (idx = 0; idx < N; ++idx) {
while (cnt < K && !s.empty() && s.top() < num[idx]) {
s.pop();
cnt++;
}
s.push(num[idx]);
}
while (cnt < K) {
s.pop();
++cnt;
}
while (!s.empty()) {
answer += s.top();
s.pop();
}
reverse(answer.begin(), answer.end());
cout << answer;
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 13975 / 파일 합치기 3 (0) | 2023.07.07 |
---|---|
C++ / 백준 / 8980 / 택배 (0) | 2023.07.06 |
C++ / 백준 / 1092 / 배 (0) | 2023.07.05 |
C++ / 백준 / 11000 / 강의실 배정 (0) | 2023.07.04 |
C++ / 백준 / 21758 / 꿀 따기 (0) | 2023.07.04 |