functionsolution(number, k) { let answer = []; let count = 0; for (let i = 0; i < number.length; i++) { let current = number[i]; if (answer.length === 0) { answer.push(current); continue; } while (answer[answer.length - 1] < current) { answer.pop(); count++; if (count === k) { return answer.join('') + number.slice(i); } if (answer.length === 0) { break; } } answer.push(current); } return answer.join('').slice(0, number.length - k); }
solution('4177252841', 4);
더 짧은 풀이
프로그래머스를 통해 새로운 솔루션을 찾았다. 굉장히 효율적인 솔루션이라는 생각이 든다…!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
functionsolution(number, k) { let answer = ''; const numbers = [...number].map((num) =>Number(num)); const stack = [0]; let toFind = k + 1; // 찾아서 제거해야 할 숫자들의 길이 (시작 stack이 0이라서 k+1 처리해줌) for (let i = 0; i < numbers.length; i++) { // 제거해야 할 게 더 있고, stack에 쌓인 숫자들 중 numbers[i]보다 작은 값이 없을 때 까지 반복 while (toFind !== 0 && numbers[i] > stack[stack.length - 1]) { stack.pop(); toFind--; } // 현재 찾은 문자들의 길이 < 최종적으로 제거하고 남아야 할 문자열의 길이 if (stack.length < numbers.length - k) stack.push(numbers[i]); } answer = stack.join(''); return answer; }