function solution(number, k) {
const stack = [];
for (let i = 0; i < number.length; i ++) {
while (stack.length && k > 0 && stack.at(-1) < number[i]) {
stack.pop();
k--;
}
stack.push(number[i]);
}
return stack.slice(0, stack.length - k).join("");
}
개인적으로 그리디 문제 유형에 약합니다. 그리디 문제 유형을 파악하는 연습을 해야할 것 같습니다. 이번 문제는 그리디로 풀 수 있는 문제였습니다.
문제를 푸는 아이디어는 다음과 같습니다.
- number의 각 원소를 순회하면서
- stack에 값이 존재하고 k가 0보다 크고 스택의 마지막 값이 현재 값보다 작으면 while문 실행
- stack의 맨 마지막 값을 pop 한뒤에 k의 값을 -1 해준다.
- 이렇게 되면 stack에는 최대 값이 저장
여기서 맨 마지막에 slice를 해주는 이유는 '4321' , 1일 때 처럼 숫자 값이 계속 작아지는 경우 stack에 계속 쌓이기만 합니다. 그래서 이런 경우일 때는 맨 마지막 숫자부터 k 만큼 값을 제거해주면 최대 값입니다.