문제
내 풀이 -실패
from collections import deque
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
str = list(input().rstrip())
stack = list()
print(str)
for i in range(n-1, 0, -1):
if len(stack) == n-m:
if int(str[i]) > int(stack[0]):
stack.popleft()
stack.appendleft(str[i])
elif int(str[i]) == int(stack[0]):
stack.pop()
stack.appendleft(str[i])
else:
continue
else:
stack.appendleft(str[i])
print(str(list(stack)))
해설
제일 큰 수를 만들어야하기에, 뒤에서부터 시작해서 검증을 했다.
무조건 제일 큰 자리만 바꾸면 해결이 될거라고 생각했는데 그렇지가 않았다.
이 문제는 말그대로 숫자가 작은 순서대로 지우고 나야 제일 큰 수가 나오는 것이었다.
정답 풀이
import sys
n, k = map(int, sys.stdin.readline().split())
nums = list(map(int, sys.stdin.readline().strip()))
result = []
delNum = k
for i in range(n):
while delNum > 0 and result:
if result[len(result) - 1] < nums[i]:
result.pop()
delNum -= 1
else:
break
result.append(nums[i])
# print(f'i는{i}')
# print(result)
for i in range(n-k):
print(result[i], end="")
해석
그런데 해답을 보니 너무 생각보다 코드가 쉬워보여서 당황스러웠다.
단순히 result의 제일 뒤 수와 비교를 하면서 delNum이라는 개념을 섞으면 답을 만들 수 있다니.
조금 허망하면서 대단하기도 하다.
이 문제의 경우 deque를 사용하면 오히려 시간이 증가한다..? 왜지?
라이브러리가 들어와서 그것을 활용하는 과정에서 시간이 더욱 소모되는 것인가?
일반적으론 stack을 리스트로 사용하는 과정에서 deque 형식으로 변경하면, pop, append의 시간복잡도가 O(1)로 떨어지는걸로 아는데
아래는 예제 3의 과정이다
10 4
4177252841
i는0
deque([4])
i는1
deque([4, 1])
i는2
deque([7]) #이곳에서 위 코드의 강점이 나온다. 필요할 경우 모든 element를 바꿔버린다.
#이를 통해 가장 큰 자리 수에 가장 큰 수가 올 수 있게 해준다
i는3
deque([7, 7])
i는4
deque([7, 7, 2])
i는5
deque([7, 7, 5])
i는6
deque([7, 7, 5, 2])
i는7
deque([7, 7, 5, 8])
i는8
deque([7, 7, 5, 8, 4])
i는9
deque([7, 7, 5, 8, 4, 1])
775841
'sw사관학교 정글 2기 > 02 이분탐색, 분할정복, 스택, 큐, 우선순위 큐' 카테고리의 다른 글
[우선순위큐]백준 13334번 철로 with Python3 ★ (0) | 2021.08.17 |
---|---|
[이분탐색] 백준 8983번 사냥꾼 with Python3 ★ (0) | 2021.08.17 |
[스택] 백준 2504번 괄호의 값 with Python3 (0) | 2021.08.16 |
[분할정복] 백준 10830번 행렬 제곱 with Python3 ★★ (0) | 2021.08.16 |
[이분탐색] 백준 11053번 가장 긴 증가하는 부분 수열 with Python3 ★ (0) | 2021.08.16 |
댓글