본문 바로가기
Algorithm/Python

[프로그래머스] 큰 수 만들기

by _sweep 2022. 4. 11.

문제 링크 >> 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으로 합쳐주고 유효한 길이만큼만 출력한다.

 

 

 

 

 

댓글