def solution(number, k):
answer = ''
total_length = len(number) - k
number_list = list(number)
idx = 0
cnt = 0
while k > 0:
temp = number_list[idx: idx+k+1]
# max 값 찾기
max_num = max(temp)
max_idx = temp.index(max_num)
print(max_idx, max_num, k)
# max 값 기준 앞에 지우기
answer += max_num
k -= max_idx
idx += max_idx + 1
print(idx, max_idx, max_num, k)
if k == 0 and len(answer) != total_length:
answer += number[-(total_length - len(answer)):]
# if cnt == 2 :
# break
# cnt += 1
return answer
temp[idx : idx+k+1] 의 배열을 만들어서 k+1개 부분 수열의 최댓값을 고르고, 그 앞에 숫자들을 다 제거하는 방식으로 접근했다. 
def solution(number, k):
# stack :: 수가 차례대로 담김(큰수부터)
stack = []
for num in number:
# 제거할 수 k가 남아있고
# 스택에 값이 있고
# 스택의 마지막 값이 num보다 작다면
# 제거 후 제거할 수 k 없데이트
while (k > 0) and (stack) and (stack[-1] < num):
stack.pop()
k -= 1
# 값 추가
stack.append(num)
# k가 남아있는 경우
if k > 0:
stack = stack[:-k]
return "".join(stack)
O(N)k를 모두 사용했거나, 스택이 빌 때까지 반복
그리고 현재 숫자를 스택에 추가(push)
Stack : 맨 앞 자릿수를 크게 만들기 위한 임시 저장소 어떻게 Stack 자료구조를 생각했을까....
문제를 보자마자 "가장 앞자리에 가장 큰 수가 와야한다"라는 아이디어는 생각했는데, 그 뒤에 구현하는 부분에서 생각한 풀이가 달랐다. stack은 생각도 못해봤다. 그래서 stack 자료구조를 선택하여 풀이를 구상하는 과정을 찾아봤다.
우선 숫자는 왼쪽부터 순서대로 살펴본다. 각 숫자를 보고 최종 결과에 포함 시킬까 말까를 결정해야 한다. 현재 숫자를 결정할 때, 이미 최종 결과의 앞부분으로 결정된 숫자들과 비교도 해야한다.
지금 숫자가 이전 숫자보다 크다면?
예를 들어 31까지 결정했는데, 다음 숫자로 9가 등장한다면? 9는 1보다 크니까 1을 제거해야하고, 3보다 크니까 3도 제거해야한다.
이렇게 이전에 결정된 숫자보다 커서 이전 숫자를 제거하고 싶다면, 이전에 결정한 숫자를 제거해야 한다. 가장 최근에 저장한 것 부터 제거-> 제거 & 되돌림의 반복
LIFO 패턴 : "가장 최근에 넣은 것을 가장 먼저 꺼낸다" 는 특징을 가지고 있다. 따라서 스택 자료구조와 특성을 통해 구현할 수 있었다.
이렇게 하면 스택에는 항상 현재까지 처리된 숫자들로 만들 수 있는 가장 큰 수의 앞 부분이 유지가 된다!
순차적으로 입력 값을 처리하면서, 현재 값을 기준으로 이전에 처리한 값 중 가장 마지막 값을 판단하여 제거하거나 유지하는 작업이 반복될 때 : stack