새소식

Computer Science/코딩테스트 문제 풀이

[예제] [파이썬] [스택] 가장 큰 수

  • -

선생님은 현수에게 숫자 하나를 주고, 해당 숫자의 자릿수들 중 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)
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.