LeetCode - Remove K Digits (Javascript)

문제 설명

배열의 순서를 변경할 수 없다는 가정 하에, 배열 내에서 어떤 k개의 숫자를 지웠을 때 가장 작은 수가 도출될 수 있는지 구하는 문제다.

k개만 지울 수 있고, 배열의 순서는 바꿀 수 없으며, return값은 k개의 숫자를 지운 최종 num이다.

Given string num representing a non-negative integer num, and an integer k, return the smallest possible integer after removing k digits from num.

Example 1:

1
2
3
Input: num = "1432219", k = 3
Output: "1219"
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.

Example 2:

1
2
3
Input: num = "10200", k = 1
Output: "200"
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.

Example 3:

1
2
3
Input: num = "10", k = 2
Output: "0"
Explanation: Remove all the digits from the number and it is left with nothing which is 0.

Constraints:

  • 1 <= k <= num.length <= 105
  • num consists of only digits.
  • num does not have any leading zeros except for the zero itself.

소스 코드

통과 되기까지 꽤나 험난했다.. ㅜ
특히, 문자열이 굉장히 길 때 이를 Number로 치환하고, 그 이후에 다시 toString()하는 과정에서 계속 오류가 났었다.

자바스크립트에서는 굉장히 큰 수에 대해서는 toString을 할 때 Infinity를 자체적으로 반환해주는 것 같다 ㅜ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function removeKdigits(num, k) {
const length = num.length;
if (length === k) return '0';
let removed = 0;
let stack = [];
for (let i = 0; i < length; i++) {
while (stack.length && stack[stack.length - 1] > num[i] && removed < k) {
stack.pop();
removed++;
}
stack.push(num[i]);
}
while (removed < k) {
stack.pop();
removed++;
}
while (stack[0] === '0' && stack.length > 1) stack.shift();
return stack.join('');
}


Author

Hoonjoo

Posted on

2022-04-04

Updated on

2022-04-04

Licensed under

Comments