선생님은 현수에게 숫자 하나를 주고, 해당 숫자의 자릿수들 중 m개의 숫자를 제거하여 가장 큰 수를 만들라고 했습니다.
여러분이 현수를 도와주세요.(단 숫자의 순서는 유지해야 합니다)
만약 5276823 이 주어지고 3개의 자릿수를 제거한다면 7823이 가장 큰 숫자가 됩니다.
▣ 입력설명
첫째 줄에 숫자(길이는 1000을 넘지 않습니다)와 제거해야할 자릿수의 개수가 주어집니다.
▣ 출력설명
가장 큰 수를 출력합니다.
▣ 입력예제 1
5276823 3
▣ 출력예제 1
7823
▣ 입력예제 2
9977252641 5
▣ 출력예제 2
99776
스텍
LIFO
리스트 팝을 이용해서 구현
숫자 입장에서 자신 앞에 자신 보다 작은 숫자가 있으면
자신 앞 숫자를 빼고 내가 앞인게 큰 숫자가 된다.
예를 들어 5276823 3 의 경우
5를 넣고 [5], 2를 넣고 [5,2] 다음 7이 나올때 7 앞 2는 7보다 작으니 지운다 -> [5,7] 1번 지움
5는 7보다 작으니 5도 지운다-> [7] 2번 지움 이제 한번만 더 지우면 된다.
7다음 6을 넣고 [7,6] 다음 8이 오는데 8보다 작은 6을 지운다-> [7,8] 3번 다 지움
이제 3번의 숫자를 다 제거 하였으니 뒤에 수는 그대로 붙인다 [7,8,2,3] 정답: 7823
다음 예제로 9977252641 5 인 경우
[9,9,7,7] 까지는 그대로 넣고 2를 넣으면 [9,9,7,7,2] 이다.
다음 5가 나오니 5보다 작은 2를 지우고 자기가 들어간다 -> [9,9,7,7,5] 1번 지움
다음 2를 넣는다 -> [9,9,7,7,5,2] 다음 6이 나오는 데 2를 제거하고 다음 5도 제거한다 -> [9,9,7,7,6] 3번 지움
다음 자기숫자보다 작은 수가 없어 계속 넣는다 [9,9,7,7,6,4,1] 근데 아직 2번 더 제거해야하기 때문에
M이 0이 아니면 stack=stack[:-M]을 한다.
이것을 코드화 해라
import sys
sys.stdin=open('input.txt','r')
if __name__=="__main__":
N,M=map(int,input().split())
nums=list(map(int, str(N)))
stack=[]
for x in nums: # 앞 숫자부터 시작해서
while stack and M>0 and stack[-1]<x:
stack.pop()
M-=1
stack.append(x)
# 다 지우지 못하는 경우
if M!=0:
stack=stack[:-M]
res=''.join(map(str, stack)) # 숫자 리스트를 문자열 리스트로 바꾸고 join으로 합쳐서 출력
print(res)