알고리즘/Programmers
[프로그래머스/C++] 큰 수 만들기
chaeD2
2022. 6. 24. 17:55
(6/24 - X)
https://programmers.co.kr/learn/courses/30/lessons/42883
코딩테스트 연습 - 큰 수 만들기
programmers.co.kr
처음에는 min_element를 이용해서 푸는 방법을 떠올렸는데 3번 테스트 케이스에서 적용되지 않는 식이었다. 다음으로는 실제 값에다 자릿수의 값으로 보정 값을 줄까 생각해 봤는데 이 또한 틀린 풀이였다. 해결 방법 자체가 떠오르지 않았다. 그래서 계속 고민하다가 구글링 해서 힌트를 얻었다. 테스트 케이스마다 신경 써 줘야 할 것이 많아서 까다로웠다.
구현
스택을 이용한다.
0. numbers를 순회하면서 1-2를 반복한다.
1. 스택이 비어 있지 않고, k가 0보다 크며, c - '0'가 스택의 top보다 클 경우 이 조건을 하나라도 만족하지 않을 때까지 1.1와 1.2 반복
1.1 top을 pop 한다.
1.2 k를 1 감소시킨다.
2. c를 스택에 push 한다.
3. 스택 사이즈가 number.size() - k보다 클 때, top과 top-1의 수를 비교하며 더 큰 수를 top에 넣는다.
참고
케이스 중 "654321" k=1, "654321" k=5, "999" k=2를 테스트 해 보자.
코드
#include <string>
#include <vector>
#include <stack>
using namespace std;
string solution(string number, int k) {
string answer = "";
int len = number.length();
int answer_size = len - k;
stack<int> s;
for (auto& c : number) { // 0
while (!s.empty() && k > 0 && c - '0' > s.top()) { // 1
s.pop(); // 1.1
k--; // 1.2
}
s.push(c - '0'); // 2
}
if (s.size() > answer_size) { // 3
int top = s.top();
s.pop();
if (s.top() < top) {
s.pop();
s.push(top);
}
}
answer.resize(answer_size);
for (int i = answer_size - 1; i >= 0; i--) {
answer[i] = (s.top() + '0');
s.pop();
}
return answer;
}