문제. 큰 수 만들기
어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
제한 조건
- number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
- k는 1 이상 number의 자릿수 미만인 자연수입니다.
입출력 예
number | k | return |
"1924" | 2 | "94" |
"1231234" | 3 | "3234" |
"4177252841" | 4 | "775841" |
나의 풀이
#1
from itertools import combinations
def solution(number, k):
nl = []
# 조합을 활용한 풀이
for i in list(combinations(number,len(number)-k)):
nl.append(''.join(i))
return max(nl)
이 문제를 보자마자 드는 생각은 조합이었습니다. number의 각 숫자를 해당 조건에 맞게 조합식을 만든 후, 최대값을 구하면 쉽게 풀리겠다고 생각했습니다. 하지만, itertools의 단점인 시간이 오래 걸려 시간 초과에 걸려 실패하였습니다.
#2
def solution(number, k):
stack = []
for i in range(len(number)): # stack 1 -> 9,4
while stack and k > 0 and stack[-1] < number[i]:
stack.pop()
k -= 1
stack.append(number[i])
return ''.join(stack[:len(number)-k])
그래서 stack을 이용하여 문제를 풀이했습니다. LIFO의 성질을 갖고 있는 스택을 이용하면 차례로 값을 비교하면서 조건에 충족하지 않는다면 바로 빼낼 수 있기에 적합하다고 생각했습니다. 스택은 많은 알고리즘에 사용할 수 있고 여러 코딩문제에도 자주 출제되는 편이라 몸에 익히는 게 중요한 것 같습니다.
반응형
'Tests > 프로그래머스' 카테고리의 다른 글
[Programmers] 영어 끝말잇기 (0) | 2020.07.24 |
---|---|
[Programmers] 다음 큰 숫자 (0) | 2020.07.23 |
[Programmers] 프로그래머스 파이썬 행렬의 곱셈 (0) | 2020.07.22 |
[Programmers] 피보나치 수 (0) | 2020.07.21 |
[Programmers] 숫자의 표현 (0) | 2020.07.20 |
댓글