이 방법을 사용하면 Python에서 통과하지 못한다. 그리고 은 효율성 측면에서도 좋지 못하다.
k
개를 빼는 문제이지만 len(number)-k
개를 뽑는 문제로 바꿔서 생각한다.len(number)-k
개 뽑으면 가장 큰 수를 만들 수 있다.push
할 값보다 작다면, 크거나 같은 값이 나올 때까지 값들에 대해서 pop
을 한다.2번 아이디어
import java.util.*;
class Solution {
public static String solution(String number, int k) {
StringBuilder answer = new StringBuilder();
Stack<Integer> stack = new Stack<>();
for(int i=0; i<number.length(); i++){
int n = number.charAt(i) - '0';
while(!stack.isEmpty() && (int)stack.peek() < n){
if(k > 0){
stack.pop();
k -= 1;
}else{
break;
}
}
stack.push(n);
}
// k가 남아있다면, 남은 만큼 뒤에서 빼준다.
for(int i=0; i<k; i++){
stack.pop();
}
// 스택 문자열로 변환
for(int i=0; i<stack.size(); i++){
answer.append(stack.elementAt(i));
}
return answer.toString();
}
}
(참고) 1번 아이디어
```java
public static String solution(String number, int k) {
StringBuilder answer = new StringBuilder();
int start = 0, end = 0;
int max_num, max_idx;
// number.length()-k개의 큰 수를 뽑음
for(int i=0; i<number.length()-k; i++){
max_num = -1; max_idx = 0;
end = k+i+1; // 끝 범위: 오른쪽에 앞으로 이어 붙여야 할 문자의 길이 -1개를 남기는 위치
// 특정 범위에서 최댓값을 뽑음
for(int j=start; j<end; j++){
int now_num = number.charAt(j) - '0';
if(max_num < now_num){
max_num = now_num;
max_idx = j;
}
}
start = max_idx+1; // 시작 범위: 이전 최댓값 위치 + 1
answer.append(max_num);
}
return answer.toString();
}
```
2번 아이디어
def solution(number, k):
stack = []
for n in number:
# n 앞에 있는 수 중 n보다 작은 숫자를 뺀다.
while stack and stack[-1] < n:
if k > 0:
stack.pop()
k -= 1
else:
break
stack.append(n)
if k > 0:
# 아직 다 빼지 못했다면 뒤에서부터 뺀다
stack = stack[:-k]
return ''.join(stack)
(참고) 1번 아이디어
이 코드는 시간 초과로 통과하지 못한다.
def solution(number, k):
answer = ''
start, end = 0, 0
# len(number)-k개의 큰 수를 뽑는다.
for i in range(0, len(number)-k):
max_num, max_idx = -1, 0
end = k + i + 1
# 범위는 이전 최대값 다음 수(=start)에서 len(number)-남은 숫자 개수(=end)까지로 잡는다.
for j in range(start, end):
if max_num < int(number[j]):
max_num = int(number[j])
max_idx = j
answer += str(max_num)
start = max_idx + 1
return answer
StringBuilder
를 사용한다.