[TIL]24-12-27

김슬아·2024년 12월 27일

정글 내에서 알고리즘 스터디를 할 때 풀었던 문제인것같은데
아예 기억이 잊힌건지..ㅎ
기억이 안나서 또 골머리싸매다 결국 이전 문제풀이를 보고 이해했다 ㅠㅠ..

import sys
N,K=map(int,input().split())
num_str=input()
stack=[]

to_remove=K

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

# 모든 숫자가 내림차순일 때 to_remove가 전혀 깎이지 않은 경우도 있으므로
stack=stack[:N-K]

print(*stack,sep="")

stack=stack[:N-K]
요부분이 왜 있어야 하나 의문이였는데

만약 주어지는 숫자가 987654321 이런식이면

끝쪽 숫자들을 제거하는게 제일 큰 숫자가 되는것이기에
for 문 안의 로직으로는 제거가 안된다.
그래서 이 경우가 나올경우도 생각하여 로직을 추가해줘야한다.

배운점 및 느낀점

  1. 스스로 어떤 반례가 있을 지 생각하며 짜는것도 상당히 중요하고 어렵다는 것을 느꼈다.
  2. 스택 자료구조를 통해 배열안의 요소들을 비교하는 아이디어를 잘 기억해놨다가 비슷한 문제들이 나오면 꼭 잊지않고 응용할 수 있게 해야겠다.
  3. 배열이름 앞에 *를 붙여 출력하면 배열안의 요소들이 공백을 띄며 출력이 되는데 sep=""을 추가로 붙여주면 공백없이 출력할 수 있다.
profile
개발자/디자이너 둘다 잘하고싶은 코린이

0개의 댓글