반응형
문제 설명
어떤 숫자에서 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" |
정답 풀이
10번 테스트 케이스 말고 다 맞는 코드
function solution(number, k) {
while (k--) {
const len = number.length;
for(let i = 0; i < len - 1; i++) {
const current = number[i];
const next = number[i + 1];
// 일반적인 상황
if (current < next) {
const before = number.substring(0, i);
const after = number.substring(i + 1);
number = before + after;
break;
}
// number = "987654321";
if (i === number.length - 2) {
number = number.substring(0, i + 1);
}
}
}
return number;
}
2중 for문을 사용해서 10번 테스트 케이스에서 시간 초과가 뜬다
스택으로 푼 방식
function solution(number, k) {
const stack = [];
number = number.split('');
for (let i = 0; i < number.length; i += 1) {
// 스택의 크기가 0이면 일단 넣는다.
if (stack.length === 0) {
stack.push(number[i]);
continue;
}
// 스택의 맨 위에 있는 값과 number[i]를 비교
// number[i]가 stack의 맨 윗 값보다 크면 계속 pop
// pop할 때마다 k를 줄여준다.
while (k > 0 && stack[stack.length - 1] < number[i]) {
stack.pop();
k--;
}
stack.push(number[i]);
}
return stack.join('').substr(0, stack.length - k);
}
반응형
'알고리즘 > 프로그래머스 2단계' 카테고리의 다른 글
[프로그래머스 LV2] 짝지어 제거하기 (Javascript) (0) | 2021.10.25 |
---|---|
[프로그래머스 LV2] 조이스틱 문제 풀이 (Javascript) (0) | 2021.08.05 |
[프로그래머스 LV2] 괄호 회전하기 문제 풀이 (Javascript) (0) | 2021.08.04 |
[프로그래머스 LV2] 후보키 문제 풀이 (Javascript) (0) | 2021.08.04 |
[프로그래머스 LV2] H-Index 문제 풀이 (Javascript) (0) | 2021.08.03 |