어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
제한 조건
number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
k는 1 이상 number의 자릿수 미만인 자연수입니다.
입출력 예
number | k | return |
---|---|---|
"1924" | 2 | "94" |
"1231234" | 3 | "3234" |
"4177252841" | 4 | "775841" |
"1924" 2라는 예시를 들었을때, 두개의 수를 제거를 하면 두개의 수를 리턴해야합니다. 다시말하면 number.length - k 만큼의 길이를 가진 어떤 수가 마지막으로 리턴되어야 합니다. 따라서 마지막 return할 answer의 길이가 number.length - k와 같아질 때까지 반복문을 돌립니다.
반복문안에서 처리할 로직은 다음과 같습니다. "1429" 2라는 예시가 있을때, number.length(4) - k(2)로 총 2개의 수를 뽑아야하는데 만약 9를 맨 처음에 뽑는다면 주어진 조건대로 처리를 할 수 없습니다. 총 두개의 수를 뽑아야 할때는 마지막 하나의 수는 보장하여 "142"중 가장 큰 수 4를 선택하고, 다음을 뽑을때는 0개의 수를 보장하여 4다음 인덱스부터 "29"중 가장 큰 수인 9를 선택합니다.
풀이에서 선언해 줘야할 것은 보장해야하는 수를 나타내는 cnt, 시작인덱스를 표시해 줄 startIdx등이 있습니다.
function solution(number, k) {
var answer = '';
let cnt = number.length - k;
let length = number.length - k;
let startIdx = 0;
while(answer.length !== length){
let maxNum = 0;
for(let i = startIdx; i <= number.length - cnt; i++){
if(maxNum < number[i]) {
//startIdx 최대값 다음 인덱스를 저장
startIdx = i + 1;
maxNum = number[i];
}
}
answer += maxNum;
cnt--;
}
return answer;
}
C++에서는 잘 작동하지만 안타깝게도 JS에서는 테스트케이스 10에서 시간초과 오류가 발생합니다ㅜㅜ...
써치를 통해 JS로 풀 수 있는 방법은 다음과 같습니다.
function solution(number, k) {
let stack = [number[0]];
let length = number.length - k;
for(let i = 1; i < number.length; i++){
while(k > 0 && stack[stack.length - 1] < number[i]){
k--;
stack.pop();
}
stack.push(number[i]);
}
// ("9412", 2) 같은 예시를 위함
stack = stack.slice(0, length);
return stack.join('');
}
스택을 이용한 풀이입니다. 다음 들어오는 요소가 stack에 들어있는 값보다 크다면 stack을 pop하고 그 요소를 push합니다.