programmers.co.kr/learn/courses/30/lessons/42883?language=python3
난 개인적으로 어려웠던 문제다.
Greedy 알고리즘은 뭔가.. 쉽고도 어려운 알고리즘이다.
stack 으로 구현한 Greedy한 풀이.. 어려워서 다른 사람 풀이를 참고했다.
- stack에 값이 있고, k가 남아있다면 stack의 마지막 값과 현재 value를 비교해
- value가 크다면 k를 사용하며 stack의 마지막 값을 빼준다.
- 앞에서부터 탐색하며 비교해주기 때문에 k를 다 써버린다면 뒷 부분은 사실 그리디하게 풀 수 없기 때문에 최적해가 아닌 경우가 발생할 수 있겠다.
- 그리디의 약점이 무조건 최적해를 보장하지는 않는다는 이유를 알 수 있다.
파이썬 코드는 다음과 같다.
def solution(number, k):
stack = []
for value in number:
while stack and stack[-1] < value and k > 0:
stack.pop()
k -= 1 # 뽑아낸 갯수 -1
stack.append(value)
if k > 0: # k가 남아 있는 경우
stack = stack[:-k]
return ''.join(stack)
* 고찰 : 그리디다운 발상을 해내기 쉽지 않다 O_O.. 아무래도 연습이 많이 필요할 것 같다.
Greedy는 순간에만 가장 큰 이득을 취하기 때문에 늘 최적해를 보장하는 것은 아니다!
'Problem Solving > programmers' 카테고리의 다른 글
[Programmers] 정수 삼각형(Python) / Dynamic Programming (0) | 2021.05.03 |
---|---|
[Programmers] 등굣길(Python) / Dynamic Programming (0) | 2021.05.03 |
[Programmers] SQL 고득점 Kit - JOIN (0) | 2021.02.26 |
[Programmers] SQL 고득점 Kit - String, Data (0) | 2021.02.26 |
[Programmers] SQL 고득점 Kit - IS NULL (0) | 2021.02.26 |