less than 1 minute read

2812번 : 크게 만들기

문제 링크

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

문제 설명

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

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ K < N ≤ 500,000)

둘째 줄에 N자리 숫자가 주어진다. 이 수는 0으로 시작하지 않는다.

출력

입력으로 주어진 숫자에서 K개를 지웠을 때 얻을 수 있는 가장 큰 수를 출력한다.

문제 풀이

풀이1 이외에도 많은 시행착오를 겪었지만 시간 초과로 모두 실패하였다.

이번 문제는 출력할 리스트를 따로 만든다는 생각을 하면 풀리는 문제이다.

아직 많이 부족하다는 것을 느끼면서 열심히 해야겠다는 생각을 한다.

# 풀이1 : 시간 초과
N, K = map(int, input().split())
num = input()
idx = 0

while K > 0 :
    if idx == len(num)-1 : 
        num = num.replace(num[num.find(min(num))], '', 1)
        idx = 0
        K -= 1
    
    elif num[idx] < num[idx+1] :
        num = num.replace(num[idx], '', 1)
        idx = 0
        K -= 1
        
    else : idx += 1
    
print(int(num))
# 풀이2 : 다른 사람들의 정답 코드
n, k = map(int, input().split())
s = input()
stack = []

for c in s:
    while stack and k > 0 and stack[-1] < c:
        stack.pop()
        k -= 1
    stack.append(c)

if k > 0 : 
    print(int("".join(stack[:-k])))
else : 
    print(int("".join(stack)))

Comments