N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ K < N ≤ 500,000)
둘째 줄에 N자리 숫자가 주어진다. 이 수는 0으로 시작하지 않는다.
출력
입력으로 주어진 숫자에서 K개를 지웠을 때 얻을 수 있는 가장 큰 수를 출력한다.
예제 입력 1
4 2
1924
예제 출력 1
94
예제 입력 2
7 3
1231234
예제 출력 2
3234
예제 입력 3
10 4
4177252841
예제 출력 3
775841
주어진 문제는 N자리 숫자에서 숫자 K개를 지워서 가장 큰 수를 만드는 문제입니다.
입출력은 다음과 같습니다:
숫자를 왼쪽에서 오른쪽으로 탐색하면서, 그 순간의 숫자가 이전의 숫자보다 더 크다면 이전 숫자를 지우는 방식으로 진행하면 해결할 수 있습니다.
아래 예시를 살펴보겠습니다.
이 방법을 사용하기 위해선 스택 자료구조를 사용해야 합니다.
왜냐하면 현재의 숫자가 이전의 숫자보다 작으면 이전 숫자를 제거한다! 이것은 스택 자료구조의 특징인 LIFO원리에 적합하기 때문입니다.
import sys
N, K = map(int, sys.stdin.readline().split())
num = sys.stdin.readline().strip()
def sol(N, K, num):
stack = []
idx = 0
for n in num:
while stack and idx < K and stack[-1] < n:
stack.pop()
idx += 1
stack.append(n)
print(''.join(stack[:N-K]))
sol(N=N, K=K, num=num)
stack
은 숫자들을 담고 있는 리스트로, 주어진 숫자를 스택에 하나씩 넣어가며 처리합니다.n
이라고 할 때, 현재 스택의 top보다 더 큰 숫자가 나오면 stack.pop()
을 통해 스택의 top을 제거하고, 그 자리에 더 큰 숫자를 넣습니다.idx
는 지운 숫자의 개수를 세는 변수로, K개를 지우면 그만큼 숫자를 지웁니다.54321
와 같이 내림차순이였다면, 스택에 그대로 들어가기때문에 스택에 남은 숫자 중에서 처음부터 N-K개를 선택해야 합니다.''.join()
을 사용하여 문자열로 만들어 출력합니다.이번 문제는 스택과 그리디 알고리즘을 활용하여, 주어진 숫자에서 K개를 제거해 가장 큰 수를 만드는 효율적인 방법을 배울 수 있었습니다. 숫자를 순차적으로 탐색하며 스택을 사용해 현재 숫자가 이전 숫자보다 크면 제거하고 더 큰 숫자를 유지하는 방식으로, 의 시간 복잡도로 문제를 해결할 수 있었습니다. 이를 통해 최적 선택 전략(그리디)과 스택 자료구조의 활용 능력을 향상시킬 수 있었습니다.
글 읽어주셔서 감사합니다.