[파이썬 알고리즘 문제풀이] - Section5 / 자료구조 활용(스택) -1

Chooooo·2023년 1월 31일
0

🎈 가장 큰 수

선생님은 현수에게 숫자 하나를 주고, 해당 숫자의 자릿수들 중 m개의 숫자를 제거하
여 가장 큰 수를 만들라고 했습니다. 여러분이 현수를 도와주세요.(단 숫자의 순서는
유지해야 합니다)
만약 5276823 이 주어지고 3개의 자릿수를 제거한다면 7823이 가장 큰 숫자가 됩니다.

▣ 입력설명
첫째 줄에 숫자(길이는 1000을 넘지 않습니다)와 제가해야할 자릿수의 개수가 주어집니다.

▣ 출력설명
가장 큰 수를 출력합니다.

▣ 입력예제 1
5276823 3

▣ 출력예제 1
7823

▣ 입력예제 2
9977252641 5

▣ 출력예제 2
99776

import sys
sys.stdin = open("input.text", "rt")
input = sys.stdin.readline

num, N = map(int, input().split())

num = list(map(int, str(num))) #스트링으로 바꾼 후에 다시 int로 맵핑 해주고 그걸 리스트화!

#데이터를 지울 것이기 때문에 인덱스 접근보단...

data = []  #결과값을 저장할 리스트.
for x in num:  #본인 앞에 있는 수보다 본인이 크면 그것들 지워야지
    while data and N > 0 and data[-1] < x:
        data.pop()  
        N -= 1
    data.append(x)

if N > 0:
    data = data[:-N]
    for x in data:
        print(x, end = "")
else:
    for x in data:
        print(x, end = "")

🎃 코멘트
각각의 자리의 숫자가 어떤 의미가 있는지 파악했어야 했다. 제거한 숫자가 가장 큰 숫자가 되려면.. 각각의 자리의 숫자들은 내 앞의 자리의 숫자들보다는 작으면 안된다는 생각 있어야 한다.
예를들어, 5276 이라면 반복문을 돌면서 2를 만났을 때 2 앞에는 5. 즉 자기보다 작은 숫자는 없으니 넘어가. 7을 만났을 때는 자기 앞에 5, 2 둘 다 작으므로 이 숫자들을 지워줘야겠지. 이런 식으로 숫자들을 지워서 가장 큰 숫자를 만들 때 각 자리의 숫자는 어떤 의미인지 생각했어야 했다. (숫자의 순서는 유지해야 된다는 조건)

결과를 따로 data 리스트에 저장하려는 시도.

  • 앞에 것을 지우고 자기가 앞으로 가고. 이런 것을 쉽게 구현하게 해주는 자료구조가 바로 스택이다.

  • 따로 join 기능 알아보자.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글