어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
제한 조건
- number는 2자리 이상, 1,000,000자리 이하인 숫자입니다.
- k는 1 이상 number의 자릿수 미만인 자연수입니다.
입출력 예
number k return
"1924" | 2 | "94" |
"1231234" | 3 | "3234" |
"4177252841" | 4 | "775841" |
문제 이해
- 글만 보면 이해가 까다로운 문제이지만, 직접 그림을 그려보면 이해가 쉽습니다.
- 숫자에서 k만큼의 수를 제거해서 가장 큰 수를 만드는 문제입니다.
- 예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문제 풀이
- 그리디 구현 문제로 시도하였으나, 답을 구할 수 없어 구글링으로 아이디어를 찾았습니다.
- 스택을 통해 구현하였으며, 기본적으로 스택의 마지막 요소가 각 숫자보다 큰지 작은지에 따라 결정됩니다.
- 만약 마지막 요소가 i보다 크다면, 그냥 스택에 i를 넣어줍니다.(큰 숫자가 앞자리로 가야하므로)
- 아니라면, 스택 마지막 요소를 제거합니다. 이때, stack[4,1] / i=7 처럼 마지막 요소가 계속해서 작은 경우가 있을 수 있으므로 while문을 통해 제거합니다.
- 테스트케이스 10번에서 실패가 뜰 경우 ["4321", 1]로 테스트케이스를 추가해보시기 바랍니다. 기본적으로 큰 수로 만들어져 있는 경우에 k만큼 뒷자리를 제거하는 로직이 필요합니다.
코드
#프로그래머스 큰 수 만들기
def solution(number, k):
stack = []
for i in number:
if not stack:
stack.append(i)
else:
while stack and stack[-1] < i and k>0:
stack.pop()
k-=1
stack.append(i)
if k>0: #처음부터 앞자리가 큰 경우 k만큼 뒷자리 제거
for i in range(k):
stack.pop()
return ''.join(stack)
print(solution("4321", 1))
print(solution("1924", 2))
print(solution("1231234", 3))
print(solution("4177252841", 4))
스택 자료구조를 활용한 좋은 문제라고 생각됩니다. 시간을 두고 자주 자주 풀어보면 좋을 것 같습니다.
'알고리즘 풀이 > Python' 카테고리의 다른 글
[Python] 이진 변환 반복하기 (프로그래머스 Lv2 파이썬) (0) | 2023.08.24 |
---|---|
[Python] 효율적인 해킹 (백준 1325 파이썬) (0) | 2023.08.24 |
[Python] 구명보트 (프로그래머스 Lv2 파이썬) (0) | 2023.08.23 |
[Python] 나이트의 이동 (백준 7562번 파이썬) (0) | 2023.08.23 |
[Python] 문자열 내 마음대로 정렬하기 (프로그래머스 Lv1 파이썬) (0) | 2023.08.22 |