https://programmers.co.kr/learn/courses/30/lessons/42883
function solution(number, k) {
var stack = []; // b : 최종 글자들이 저장될 스택 (숫자가 큰!)
for (var i = 0; i < number.length; i++) { // 모든 숫자 비교
var now = number[i]; // 현재 인덱스 숫자. 처음에는 그냥 push
// 무조건 push 하고 다음 for 문에서 이전인덱스 숫자와 나랑 비교해서 현재인덱스가 이전인덱스보다 크면 pop하고 넣어줌. 제거하는 숫자인 (k)를 1 감소
// 제거할 숫자를 다 채웠으면 그냥 넣음
while (k > 0 && stack[stack.length - 1] < now) {
stack.pop();
k--;
}
stack.push(now);
}
// k가 0일 경우 스택은 그대로,
// but k가 남아있으면 뒤에서부터 제거해준다. (ex. 1010,2 -> 11)
stack.splice(stack.length - k, k);
var answer = stack.join('');
return answer;
}
1. 실패한 코드 - test 10번 틀림
- 다른 질문들 참고한 결과, 코드의 효율성이 매우 낮음...
```javascript
function solution(number, k) {
var answer = 0;
var answerArr = [];
var length = number.length;
var arr = number.split('');
var newArr = arr.map(num => parseInt(num));
// Find first number and Index
// string, number check
var max = Math.max(...newArr.slice(0, k+1));
var index = newArr.indexOf(max);
var remain = k - index; //remain possible number to remove
// Remove remain from subArr
answerArr.push(max);
var subArr = newArr.slice(index+1, length);
for(var i=0; i<subArr.length; i++){
var compare = subArr.slice(i+1, i+remain+1)
if(compare.some(num => subArr[i] < num)){
remain = remain - 1;
subArr.splice(i,1);
i = i-1;
if(remain === 0) {
break;
}
}
}
while(remain !== 0){
subArr.pop();
remain = remain-1;
}
const finalArr = answerArr.concat(subArr);
// answer should be string
answer = finalArr.join('');
return answer;
}
코딩을 시작하기 전에 알고리즘을 정확하게 도식화하고 단순화할 수 있어야 한다!
-> 알고리즘 자체가 너무 복잡.. -> max 구하는 과정이 불필요..
arr.findIndex() vs arr.indexof()
arr.splice() vs arr.slice()
arr.concat()
arr.join()
큰 숫자 -> 자릿수와 관련있다
#탐욕법
#stack