https://www.acmicpc.net/problem/2812
2812번: 크게 만들기
N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
📌 해결순서 1 (시간초과)
일단 지워야할 숫자를 다 지우고 나면 남은 숫자는 추가해야하는 숫자들이기 때문에 지우는 방식이 아닌, 시작부터 숫자를 추가해가는 방법을 생각했다
# 추가하는 경우
1. 뒤에 기준 숫자보다 큰 수가 없는 경우 : 기준 숫자의 인덱스 + 남은 사이즈가 배열의 크기를 초과하지 않으면 추가
2. 뒤에 기준 숫자보다 큰 수가 있는 경우 : 그 큰 수의 인덱스 + 남은 사이즈가 배열의 크기를 초과 하면 추가
3. 비교해야하는 수의 갯수와 남은 사이즈가 같은 경우 : 남은 숫자를 모두 추가하고 종료
📌 코드
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
del_cnt = k
lst = input().rstrip()
ans = []
for i in range(n):
while ans and k > 0:
# 현재 스택에 추가되어있는 마지막 숫자와 추가될지 말지 결정해야하는 숫자를 비교
if int(ans[-1]) < int(lst[i]):
k -= 1
ans.pop()
else:
break
ans.append(lst[i])
# 주어진 숫자가 내림차순 정렬이 된 경우도 있기 때문에, n-k 만큼만 출력한다
print(''.join(ans[:n-del_cnt]))
📌 해결순서 2 (스택 자료구조 사용)
지울지 말지 결정해야하는 순간에서 최선의 결정을 내린다
1. 지울수 있는 숫자의 갯수가 0 보다 크고 빈 스택이 아닌 경우에서만 비교한다
2. 스택에 있는 마지막 숫자(조건을 활용해서 만들수 있는 최댓값) 이 현재 입력된 숫자보다 작다면 스택의 마지막 숫자를 꺼내고 현재 입력된 숫자를 넣는다 , 지울수 있는 숫자 -= 1
3. 반복
4. 주의해야 할 점은, 예제 입력 자체가 내림차순으로 정렬될 수 있기 때문에 n - k 만큼만 출력할 수 있도록 해야한다.
📌 코드
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
lst = input().rstrip()
ans = []
for i in range(n):
while ans and k > 0:
# 현재 스택에 추가되어있는 마지막 숫자와 추가될지 말지 결정해야하는 숫자를 비교
if int(ans[-1]) < int(lst[i]):
k -= 1
ans.pop()
else:
break
ans.append(lst[i])
# 주어진 숫자가 내림차순 정렬이 된 경우도 있기 때문에, n-k 만큼만 출력한다
print(''.join(ans[:n-k]))
'algorithm > Greedy' 카테고리의 다른 글
백준 2839 설탕배달 (0) | 2022.08.29 |
---|---|
백준 1744 두 수 묶기 (0) | 2022.08.29 |
백준 13305 주유소 (0) | 2022.08.28 |
백준 1931 회의실 배정 (0) | 2022.08.28 |
백준 1946 신입사원 (0) | 2022.08.26 |