Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 알고리즘
- 삼성역테
- sort
- 포스코 교육
- dfs
- DP문제
- 포스코 ai 교육
- 포스코 AI교육
- bfs문제
- 삼성코테
- 코테 문제
- 삼성코딩테스트
- dfs문제
- 삼성역량테스트
- 초소형머신러닝
- 다이나믹프로그래밍
- TensorFlow Lite
- 딥러닝
- tflite
- DP
- 컴퓨팅사고
- 코딩테스트
- 영상처리
- tinyml
- 자료구조
- 코테
- 임베디드 딥러닝
- MCU 딥러닝
- BFS
- 그리디
Archives
- Today
- Total
코딩뚠뚠
[백준문제풀이] 2812 크게 만들기 본문
반응형
풀이일시 : 2020-09-10
문제 :
N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
입력 :
첫째 줄에 N과 K가 주어진다. (1 ≤ K < N ≤ 500,000)
둘째 줄에 N자리 숫자가 주어진다. 이 수는 0으로 시작하지 않는다.
ex)
4 2
1924
출력 :
입력으로 주어진 숫자에서 K개를 지웠을 때 얻을 수 있는 가장 큰 수를 출력한다.
ex)
94
풀이 :
그리디알고리즘
숫자의 자리를 바꾸면 안된다.
단순히 앞에서부터 숫자를 읽어가면서 스택에 넣으면 된다. 다만 새롭게 등장한 뒤에있는 숫자보다 작은 숫자들을 모두 스택에서 빼는 과정을 거쳐 스택에는 오직 큰 숫자들만 넣어주면 된다.
스택에 다 넣은 뒤에도 지워야되는 숫자가 있다면? -> 뒤에서부터 원하는 자리수대로 뽑으면 된다.
#include <iostream>
#include <vector>
using namespace std;
int n, k;
string a;
vector<char> result;
int main() {
cin >> n >> k >> a; // N자리 숫자, K개를 지우는 것 a숫자
int i = 0;
while (i != a.size()) {
while (k != 0 && !result.empty() && result.back() < a[i]) {
result.pop_back(); //들어간 값이 있던값보다 작으면 있던값을 result에서 꺼낸다.
k--; //k개만 지우면 되므로
}
result.push_back(a[i]); //result에 넣는다.
i++;
}
while (k--) { //k가 다 안지워졌다면 나머지를 지워주는것
result.pop_back(); //pop_back으로 꺼내지않고 담겨있는 그대로 0부터 출력한거
}
for (int i = 0; i < result.size(); i++) {
cout << result[i];
}
}
참고자료 : vector container
반응형
'알고리즘 문제풀이 > 백준문제풀이' 카테고리의 다른 글
[백준문제풀이] 1929 소수구하기 (0) | 2020.12.31 |
---|---|
[백준문제풀이] 1978 소수찾기 (0) | 2020.12.31 |
[백준문제풀이] 1969 DNA (0) | 2020.12.31 |
[백준문제풀이] 1783 병든나이트 (0) | 2020.12.31 |
[백준문제풀이] 2437 저울 (0) | 2020.12.31 |