스택, 그리디
cnt<k
인 상황이라면 스택에 맨 마지막으로 들어간 애 제거해주면 됨 # k개만큼 제거 안됐을 시엔 k개만큼 뒤에서부터 제거
while cnt<k :
stack.pop()
cnt+=1
import heapq
import sys
n,k = map(int,sys.stdin.readline().rstrip().split())
lis=list(map(int,sys.stdin.readline().rstrip()))
stack = []
cnt = 0
for i in range(n) :
while stack :
if cnt<k and stack[-1] < lis[i]:
# 내가 스택 마지막 애보다 크면 스택 마지막 애 제거
# ( 내 이전 애들은 나보다 커야하므로 )
stack.pop()
cnt+=1
else : break
stack.append(lis[i])
# k개만큼 제거 안됐을 시엔 k개만큼 뒤에서부터 제거
while cnt<k :
stack.pop()
cnt+=1
for j in stack :
print(j,end="")
import sys
import heapq
n,k = map(int,sys.stdin.readline().rstrip().split())
# N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수
lis=list(map(int,sys.stdin.readline().rstrip()))
lis_heap = lis.copy()
heapq.heapify(lis_heap)
for i in range(k) :
target = heapq.heappop(lis_heap)
lis.remove(target)
for l in lis :
print(l,end="")
from collections import deque
import sys
n,k = map(int,sys.stdin.readline().rstrip().split())
lis=list(map(int,sys.stdin.readline().rstrip()))
target_lis = [0 for _ in range(500001)]
lis_heap = lis.copy()
lis_heap.sort()
lis_heap = deque(lis_heap)
for j in range(k) :
target_lis[lis_heap.popleft()]+=1
for j in range(n) :
if target_lis[lis[j]]>0:
target_lis[lis[j]]-=1
else :
print(lis[j],end="")
import sys
n,k = map(int,sys.stdin.readline().rstrip().split())
lis=list(map(int,sys.stdin.readline().rstrip()))
stack = []
cnt = 0
for i in range(n) :
while stack :
if cnt<k and stack[-1] < lis[i]:
# 내가 스택 마지막 애보다 크면 스택 마지막 애 제거
# ( 내 이전 애들은 나보다 커야하므로 )
stack.pop()
cnt+=1
else : break
stack.append(lis[i])
for j in stack :
print(j,end="")
=> 반례
10 5
9993333932
정답 : 99993
출력 : 999932
5 3
98291
정답 : 99
출력 : 991
- 근데 예외처리 해주어야 하는 부분은 맨 마지막 요소이다.
- 맨 마지막 요소 앞에는 이미 걸러진 애들만 있어서 자신보다 작은 애들이 없을 수도 있다.
- 이 상황에서 cnt (삭제한 갯수) 가 k (삭제해야 하는 갯수) 보다 작으면 이 마지막 요소를 없애줘야 함
- 이 마지막 요소가 삭제 안된 것은 나보다 앞에 애들이 이미 커서 (나보다 작은 애들이 없기 때문 ) 가 이유이다.
- 이 말인 즉슨 마지막 요소가 가장 작은 요소이므로 끝까지 다 돌았는데도cnt<k
인 상황이라면 스택에 맨 마지막으로 들어간 애 제거해주면 됨# k개만큼 제거 안됐을 시엔 k개만큼 뒤에서부터 제거 while cnt<k : stack.pop() cnt+=1
파이썬 heapq 의 시간복잡도
heappop - O(logN)
remove 시간복잡도
O(N)