Computer Science/알고리즘

[백준 - Python] 2812 - 크게 만들기

바보1 2023. 8. 25. 00:37

0.  문제 링크

 

 

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

 

2812번: 크게 만들기

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

www.acmicpc.net


1.  풀이 방법

 

 

  1. while(특정 숫자가 들어오면 스택의 앞선 숫자와 비교한다.)
  2. 이때 들어오는 숫자가 더 크다면 스택을 팝한다. (k에 1씩 빼면서)
  3. 위 방식을 사용하면 앞자리가 큰 순서대로 스택에 쌓인다.
  4. 반복문을 탈출했는데, k가 0이 아니라면 이는 숫자가 대체적으로 내림차순이라는 의미이므로 스택에서 앞의 n - k개의 숫자를 출력한다.

2.  코드

 

 

import sys
input = sys.stdin.readline


def sol():
    n, k = map(int, input().split())
    maps = list(input().strip())
    stack = []
    ansLen = n - k
    
    for i in range(n):
        while stack and stack[-1] < maps[i] and k > 0:
            # 오등큰수와 매우 흡사함
            # while 현재 숫자 들어오는 숫자보다 스택에 있는 숫자가 작으면 팝함
            # 빼는 횟수만큼 k에서 1을 빼야함
            k -= 1
            stack.pop()
        stack.append(maps[i])

    print(''.join(stack[0:ansLen]))     # n이 내림차순이라면 스택에 숫자가 다 들어감 == k가 0이 아님. 따라서 ansLen만큼 프린트함


if __name__ == "__main__":
    sol()

3.  마무리