문제 설명
어떤 숫자에서 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" |
풀이
(1) 첫번째 풀이 : Timeout
보자마자 조합으로 풀어야지! 하고 풀었으나 조합의 시간복잡도는 O(n^2)이므로 타임아웃...
다른 방법을 찾아야했다
from itertools import combinations
def solution(number, k):
num_list = list(map(''.join, combinations(number, len(number)-k)))
num_list.sort(reverse=True)
return num_list[0]
(2) 두번째 풀이 : 정답
보통 순서가 정해져있고 무언가 제거하는 문제면 스택/큐로 잘 풀린다.
스택을 사용해서 풀었다. while 조건문 설정이 중요했다.
def solution(number, k):
stack = []
for num in number:
# stack이 True, 앞 숫자보다 현재 숫자가 클 때, 제거할 숫자 갯수가 남아있을 때
while stack and stack[-1] < num and k > 0:
stack.pop()
k -= 1 # 숫자 제거했으니 k -= 1
stack.append(num)
if k > 0: # 아직 k가 0보다 큼 == 숫자가 k만큼 덜 제거됨
stack = stack[:-k]
return ''.join(stack)
'💻dev > 💡코딩테스트' 카테고리의 다른 글
프로그래머스 | Lv.2 주식가격 (파이썬) (0) | 2023.04.06 |
---|---|
프로그래머스 | Lv.2 다리를 지나는 트럭 (파이썬) (0) | 2023.04.05 |
프로그래머스 | Lv.2 기능 개발 (파이썬) (0) | 2023.04.03 |
프로그래머스 | Lv.2 H-index (파이썬) (0) | 2023.04.03 |
백준 | 5622 다이얼 (파이썬) (0) | 2023.04.02 |