[python] 백준 2812 :: 크게 만들기 (스택)
2023. 3. 12. 23:12ㆍAlgorithm
728x90
반응형
[크게 만들기]
문제
N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ K < N ≤ 500,000)
둘째 줄에 N자리 숫자가 주어진다. 이 수는 0으로 시작하지 않는다.
출력
입력으로 주어진 숫자에서 K개를 지웠을 때 얻을 수 있는 가장 큰 수를 출력한다.
풀이
- 뒤에서 아무리 큰 숫자가 나와봤자, 앞에 있는 숫자들의 개수가 지울수 있는 총 개수보다 많으면 소용이 없다.
- 앞에서부터 하나씩 비교해가면서 지울 수 있는 개수만큼 지워나가야 한다.
👇🏻 요로케
숫자를 앞에서부터 하나씩 떼어서 그 앞에 나왔던 숫자보다 큰 숫자인지 확인한다.
지금 숫자가 앞에 나온 숫자들보다 큰 숫자이고, 제거할 수 있는 숫자의 개수가 남아있으면 그 숫자를 지워버린다!
전체 코드
n, k = map(int, input().split())
number = input()
stack = [] # 남길 수열을 저장할 스택
remove_count = k # 제거해야 할 숫자의 개수
for num in number: # 수열의 각 숫자를 하나씩 순회
while stack and remove_count and stack[-1] < num:
# 스택이 비어있지 않고,
# 아직 제거해야 할 숫자가 남았으며,
# 스택의 마지막 숫자가 현재 숫자보다 작을 경우
stack.pop() # 지금 비교한 숫자 제거
remove_count -= 1 # 제거해야 할 숫자의 개수를 1 감소시킴
stack.append(num) # 현재 숫자를 스택에 추가
# 선택한 수열에서 k개의 숫자를 제거하여 만들 수 있는 가장 큰 수를 출력
print(''.join(stack[:n-k]))
🚨출력 주의사항
- 아래 예시처럼 맨 마지막의 숫자가 지워져야 하는 경우가 있을 수 있다.
# 입력
5 1
54321
# 답
5432
- 출력할 때 숫자의 총길이에서 지워야 할 개수를 뺀 만큼만 출력하도록 해야 한다.
(이렇게 안하면 72%에서틀렸습니다
가 나온다ㅎㅎ😠)
728x90
반응형
'Algorithm' 카테고리의 다른 글
[python] 백준 1655 :: 가운데를 말해요 (최대힙, 최소힙, 우선순위 큐) (0) | 2023.03.13 |
---|---|
[python] 백준 10830 :: 행렬 제곱 (분할 정복) (0) | 2023.03.11 |
[python] 백준 1629 :: 곱셈 (분할 정복, 모듈러 연산, 메모이제이션) (0) | 2023.03.11 |