Algorithm/Greedy
[Greedy] 백준 2812번 “크게 만들기” Python 풀이
운호(Noah)
2023. 11. 25. 20:08
문제 링크
풀이
- 큰 수가 되려면 높은 자리수의 숫자가 커야합니다.
- 그래서 스택을 이용합니다.
- 예를 들어, 4177252841 이고 k = 4이면 775841이 최대값이겠죠?
- 먼저 4를 stack에 집어넣습니다.
- stack = [4]
- 다음 1을 stack에 넣어야 하는데, stack의 최근 값인 4보다 1이 작거나 같죠? 그래서 그냥 stack에 1을 넣습니다.
- stack = [4, 1]
- 다음 7을 stack에 넣어야 하는데, stack의 최근 값인 1보다 7이 크죠? 그래서 1을 pop 합니다.
- stack = [4], k = 3
- 아직 stack의 최근 값인 4보다 7이 크죠? 그래서 4를 pop 합니다.
- stack = [], k = 2
- 이제 stack에 7을 집어넣습니다.
- stack = [7]
- 다음 7을 stack에 넣어야 하는데, stack의 최근 값인 7보다 7이 작거나 같죠? 그래서 그냥 stack에 7을 넣습니다.
- stack = [7, 7]
- 다음 2를 stack에 넣어야 하는데, stack의 최근 값인 7보다 2가 작거나 같죠? 그래서 그냥 stack에 2를 넣습니다.
- stack = [7, 7, 2]
- 다음 5를 stack에 넣어야 하는데, stack의 최근 값인 2보다 5가 크죠? 그래서 2를 pop하고 5를 넣습니다.
- stack = [7, 7, 5], k = 1
- 다음 2를 stack에 넣어야 하는데, stack의 최근 값인 5보다 2가 작거나 같죠? 그래서 그냥 2를 넣습니다.
- stack = [7, 7, 5, 2]
- 다음 8을 stack에 넣어야 하는데, stack의 최근 값인 2보다 8이 크죠? 그래서 2를 pop 합니다.
- stack = [7, 7, 5], k = 0
- 이제 k=0 이므로 나머지 숫자들은 그냥 추가합니다.
- stack = [7, 7, 5, 8, 4, 1]
코드
import sys
N, K = map(int, sys.stdin.readline().split())
num = list(sys.stdin.readline())
k = K # 기존 K 값 저장
stack = []
for i in range(len(num)):
# 뺄 수 있는 횟수가 남아있고, 스택의 값이 남아있고, 현재 값이 stack의 최근값보다 클 경우 POP
while (k > 0 and stack and num[i] > stack[-1]):
stack.pop()
k -= 1
# 그 외 경우엔 현재 값을 stack에 삽입
stack.append(num[i])
# 예외 케이스) 5 2 / 19876 일 경우, 답은 987
print("".join(stack[:N-K]))