어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
number | k | return |
---|---|---|
"1924" | 2 | "94" |
"1231234" | 3 | "3234" |
"4177252841" | 4 | "775841" |
# 문자열 형식으로 숫자 number
# 제거할 수의 개수 k
# number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return
def solution(number, k):
stack = [] # 결과를 저장할 스택 초기화
for i in number:
while stack and stack[-1] < i and k > 0: # 스택이 비어있지 않고, 스택의 마지막 숫자가 현재 숫자보다 작고, 제거할 숫자가 남아있으면
stack.pop() # 스택의 마지막 숫자 제거
k -= 1 # 제거할 숫자 개수 -1
stack.append(i) # 현재 숫자를 스택에 추가
# 모든 반복문이 끝난 후, 스택의 길이를 전체 길이에서 k를 뺀 길이로 조정
# 제거할 숫자가 남아있는 경우 처리
stack = stack[:len(number)-k]
return ''.join(stack) # 스택에 있는 숫자들을 문자열 형태로 합쳐서 출력
그리디 알고리즘을 사용하여 푸는 문제로 큰 숫자를 최대한 앞으로 배치하는 게 목표라는 걸 정확하게 이해하고 풀어야 한다. 스택을 사용해서 숫자를 순차적으로 처리하고, 스택의 마지막 숫자보다 현재의 숫자가 클 경우에는 k의 개수만큼 스택의 마지막 숫자를 제거해가면서 큰 숫자를 유지해야 한다.