어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
number : "1924"
k : 2
"94"
number는 2자리 이상, 1,000,000자리 이하인 숫자입니다.
k는 1 이상 number의 자릿수 미만인 자연수입니다.
function solution(number, k) {
let stack = [];
for (let i = 0; i < number.length; i++) {
let current = number[i];
while (stack.length > 0 && k > 0 && stack[stack.length - 1] < current) {
stack.pop();
k--;
}
stack.push(current);
}
stack = k > 0 ? stack.slice(0, stack.length - k) : stack;
return stack.join("");
}
코드가 되게 짧아서 간단하게 풀릴 것 같지만 생각보다 삽질을 오래했다. 큰 수부터 넣어주려고 했는데 큰 수부터 순차적으로 넣을 경우, 가장 큰 수보다 작은 수가 앞에 들어오게 되면 작아지기 때문에 이를 방지해주어야 했다. 그래서 9부터 순차적으로 number에 존재하면서, k개를 제거했을 때에 가장 큰 수 앞에 다른 수가 오지 않아도 되고, 가장 큰 수가 너무 뒤쪽에 위치해 해당 수를 가장 왼쪽에 위치시킬 수 없을 경우가 아닌 가장 큰 수를 찾아서 이후 내용을 구현하려고 했으나...... 너무 코드가 끼워맞추기 식으로 변하는 것 같고 그리디가 전혀 아니게 풀리는 것 같아 갈아엎었다. 해당 알고리즘은 솔직히 쉽게 생각 안 날 것 같은데... 이런 유사한 문제는 많이 나왔던 것 같아서 풀이 방법을 기억해 두어야겠다.