Skip to content

2812 크게 만들기 {boj} {stack}

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

이 문제의 풀이에서 시간초과가 날 법한 부분을 고르시오.#

def sol(n: int, k: int) -> int:
    """n에서 k개의 숫자를 지웠을 때 얻을 수 있는 가장 큰 수를 출력한다"""
    stack = []
    for digit in [int(c) for c in str(n)]:
        while k > 0 and len(stack) > 0 and digit > stack[-1]:
            k -= 1
            stack.pop()
        stack.append(digit)
    while k > 0:
        k -= 1
        stack.pop()
    return int("".join([str(x) for x in stack]))


_, k = [int(x) for x in input().split()]
n = int(input())

print(sol(n, k))

str, int 형변환에서 시간을 많이 잡아먹는다.#

위의 코드는 input할 때 한 번, sol 함수 루프 돌 때 한 번, 리턴할 때 N번 형변환을 수행한다. 리턴을 제외한 부분들을 모두 덜어내니 바로 1832ms에서 220ms로 확 줄었다. 아래는 형변환 없이 통과한 코드이다.

def sol(n: str, k: int) -> str:
    """n에서 k개의 숫자를 지웠을 때 얻을 수 있는 가장 큰 수를 출력한다"""
    stack = []
    for digit in (int(x) for x in n):
        while k > 0 and len(stack) > 0 and digit > stack[-1]:
            k -= 1
            stack.pop()
        stack.append(digit)
    while k > 0:
        k -= 1
        stack.pop()
    return "".join([str(x) for x in stack])


if __name__ == "__main__":
    _, k = input().split()
    n = input()

    k = int(k)

    print(sol(n, k))