[백준] 2812 : 크게 만들기

letsbebrave·2022년 4월 10일
0

codingtest

목록 보기
92/146
post-thumbnail

문제

유사 문제

https://velog.io/@letsbebrave/%EB%B0%B1%EC%A4%80-2493-%ED%83%91

정답 풀이

참고 블로그
https://kyoung-jnn.tistory.com/entry/%EB%B0%B1%EC%A4%802812%EB%B2%88%ED%8C%8C%EC%9D%B4%EC%8D%ACPython-%ED%81%AC%EA%B2%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EA%B7%B8%EB%A6%AC%EB%94%94-Greedy

import sys
# 스택의 제일 위의 값과 넣을 값을 비교하며 
# 넣을 값이 클 경우 스택의 제일 위의 값을 제거
# 반복하며 넣을 값이 작아질 경우 스택에 넣어줌

# 제일 큰수로 만들려면 앞에 있는 작은 수부터 제거해야

n, k = map(int, sys.stdin.readline().split())
nums = list(map(int, sys.stdin.readline().strip()))
answer = []
delNum = k

for i in range(n):
    while delNum > 0 and answer: # delNum > 0이고 stack에 값이 있을 때동안 현재 자신보다 작은 게 stack에 남아있으면 모두 pop해줌
        if answer[len(answer)-1] < nums[i]:
            answer.pop()
            delNum -= 1
        else: # stack에 있는 값이 나보다 크면 그대로 두고 break 
            break
    answer.append(nums[i]) # 그 전꺼가 나보다 작은지 큰지 비교하고 내꺼 넣어주기 // 더이상 delNum > 0이 아니면 계속 append

for i in range(n-k):
    print(answer[i], end="")
    

혼자 풀어본 풀이(오답)

import sys

n, k = map(int, sys.stdin.readline().split())
num = sys.stdin.readline().strip()

alist = [] # 순서대로 되어 있는 리스트
answer = []

for i in range(len(num)):
    alist.append(int(num[i]))

stack = []
cnt = 0
for i in range(n):
    while stack:
        if cnt == k:
            break
        if stack[-1] < alist[i]:
            answer.append(alist[i])
            stack.pop()
            cnt += 1
        elif stack[-1] > alist[i]:
            stack.append(alist[i])
            cnt += 1
        else:
            stack.append(alist[i])
        
    stack.append(alist[i])

print(answer)
profile
그게, 할 수 있다고 믿어야 해

0개의 댓글