https://school.programmers.co.kr/learn/courses/30/lessons/42883
본 문제는 3학년 2학기 알고리즘 소모임 알고리듬 활동으로 풀이한 문제입니다.
스택을 활용하여 그리디 알고리즘을 구현해야 하는 문제였다.
이번 문제는 스택을 활용하여 그리디 알고리즘을 구현해야 하는 문제였다.
오랜만에 코테 문제를 푸니 감각이 많이 무뎌졌다. 공모전에 너무 몰두해서 그런가..
스택을 응용하면서, 어떤 수를 제거할지 순차적으로 탐색해나간다.
숫자로 이루어진 문자열 number
와 제거해야 할 숫자의 수량인 k
가 주어진다.
이때, number
내 숫자들 중에서 k
개를 제거했을 경우 가장 큰 수가 나와야 한다.
따라서 나는 앞의 세 숫자를 기준으로 어떤 수를 제거할지 정하는 방식을 생각했다.
def solution(number, k):
if len(number) == 2:
return max(int(number[0]), int(number[1]))
start = 0
while k > 0:
first, second, third = map(int, number[start:start + 3])
if first < second:
number, start = number[:start] + number[start + 1:], 0
k -= 1
continue
if second < third:
number, start = number[:start + 1] + number[start + 2:], 0
k -= 1
continue
start += 2
return number
코드를 쓰면서도 이건 아닌데... 라는 생각이 든다면 정답이다. 오답이었다.
나는 처음 세 숫자를 기준으로 아래와 같은 소거 규칙을 정했다.
하지만 해당 규칙은 모든 수가 내림차순 으로 이루어진 경우 어김없이 오류를 뿜었다.
def solution(number, k):
stack = []
for num in number:
while stack and stack[-1] < num and k > 0:
stack.pop()
k -= 1
stack.append(num)
return "".join(stack[:len(stack) - k])
역시 스택만큼 활용도가 높은 알고리즘이 없다. 스택 만만세.
number
문자열에서 걸러낸 숫자를 담을 리스트인 stack
을 함수 내부에 선언한다.
이후 문자열을 순차적으로 탐색하여 아래와 같은 규칙을 통해 stack
에 값을 추가한다.
stack
이 비어있다면 무조건 해당 값을 stack
에 추가해야 한다.stack
에 값이 있다면, 현재 숫자와 가장 마지막으로 저장된 값을 비교한다.stack
에서 값을 제거한다.stack
이 비게 된다면 값을 제거할 수 없으므로, 반복을 중단해야 한다.위와 같이 규칙을 설계하고 문제를 풀었더니, 곧바로 정답 처리를 내려주셨다 (...)
진짜 스택은 어디에서든 도입할 수 있는 알고리즘인지라 더더욱 신경써야겠다.
https://github.com/RookieAND/BaekJoonCode
프로그래머스의 경우 solution 함수 내에서 코드를 구현하는 방식이 독특했다.
앞으로는 프로그래머스 쪽 문제도 많이 풀어봐야겠다.