Python/Coding Test

[백준] 2812 : 크게 만들기

semperparatus 2024. 4. 8. 19:37

https://www.acmicpc.net/problem/2812

 

2812번: 크게 만들기

N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net


코드

N, K = map(int, input().split())
num = list(map(int, list(input())))
stack = []

for i in num:
    while stack and stack[-1] < i and K > 0:
        stack.pop()
        K -= 1
    stack.append(i)

if K == 0:
    print(''.join(map(str, stack)))
else:
    print(''.join(map(str, stack[:-K])))

풀이

해당 문제는 스택을 활용해야 한다. 스택 문제를 여러 번 풀다보니 구조가 익숙해진 거 같다. 리스트 길이만큼 돌면서 스택에 추가해주고, 다음 원소와 스택의 끝 원소를 비교하는 구조가 기본이다.

이 문제에서도 현재 값과 스택의 마지막 값을 비교해서 현재값이 더 크면 스택의 마지막 값을 빼주고, 빼야하는 숫자의 개수 K에서 -1을 해준다. 그리고, K가 0이 되었을 때 더이상 숫자를 뺄 수 없으므로 나머지 숫자는 다 스택에 추가해준다.

주의해야 할 점은 출력이다. 처음 출력할 때, 스택의 원소를 문자열로 바꿔 출력을 했고 테스트케이스도 전부 통과했다. 하지만 간과한 점은 K가 아직 0보다 클 수 있다는 점이다. 즉, 빼야할 숫자 개수만큼 빼지 못한 것이다. 이 경우에는 빼지 못 한 개수만큼 뒤에서 차감해주고 출력하면 된다.