문제 링크 >> https://programmers.co.kr/learn/courses/30/lessons/42883
📋 문제
어떤 숫자에서 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" |
📝 풀이
❌ 첫 번째 풀이
from itertools import combinations
def solution(number, k):
answer = 0
arr = list(combinations(list(number),len(number)-k))
for item in arr:
temp = ''
for i in item:
temp += i
answer = max(answer, int(temp))
return str(answer)
문제를 단순히 생각해 조합을 이용해 푼 예시이다.
당연하게도 시간초과가 난다.
✔️ 두 번째 풀이
def solution(number, k):
answer = [number[0]]
for i in range(1, len(number)):
while answer and k > 0 and answer[-1] < number[i]:
answer.pop()
k -= 1
answer.append(number[i])
return ''.join(answer[:len(number)-k])
문제의 분류인 그리디에 초점을 둔 문제 풀이이다.
그리디로 풀기 위해 스택을 이용한다.
먼저 스택인 answer에 number의 0번 인덱스 요소를 담아준다.
그리고 answer와 k가 유효할 때, answer의 top에 있는 요소가 들어올 요소보다 작다면 number[i]보다 크거나 같은 값이 나올 때까지 answer의 요소들을 pop한다.
또한 수를 제거하는 과정이므로 k도 1씩 감소시킨다.
더이상 감소할 것이 없다면 answer에 number[i]를 넣어준다.
for문의 순회가 끝났다면 answer의 요소들을 join으로 합쳐주고 유효한 길이만큼만 출력한다.
'Algorithm > Python' 카테고리의 다른 글
[백준 1254번] 팰린드롬 만들기 (0) | 2022.04.12 |
---|---|
[백준 1158번] 요세푸스 문제 (0) | 2022.04.12 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2022.04.11 |
[LeetCode] Container With Most Water (0) | 2022.04.11 |
[LeetCode] Assign Cookies (0) | 2022.04.09 |
댓글