[탐욕법(Greedy)_Level2] 큰 수 만들기

하복치·2024년 5월 17일
3

프로그래머스

목록 보기
20/27
post-thumbnail

문제 설명

어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.

예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.

문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.

제한사항

  • number는 2자리 이상, 1,000,000자리 이하인 숫자입니다.
  • k는 1 이상 number의 자릿수 미만인 자연수입니다.

입출력 예

numberkreturn
"1924"2"94"
"1231234"3"3234"
"4177252841"4"775841"

🗝️나의 풀이

# 문자열 형식으로 숫자 number
# 제거할 수의 개수 k
# number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return
def solution(number, k):
    stack = []  # 결과를 저장할 스택 초기화
    
    for i in number:
        while stack and stack[-1] < i and k > 0:  # 스택이 비어있지 않고, 스택의 마지막 숫자가 현재 숫자보다 작고, 제거할 숫자가 남아있으면
            stack.pop()  # 스택의 마지막 숫자 제거
            k -= 1  # 제거할 숫자 개수 -1
        stack.append(i)  # 현재 숫자를 스택에 추가
        
    # 모든 반복문이 끝난 후, 스택의 길이를 전체 길이에서 k를 뺀 길이로 조정
    # 제거할 숫자가 남아있는 경우 처리
    stack = stack[:len(number)-k]  
    
    return ''.join(stack)  # 스택에 있는 숫자들을 문자열 형태로 합쳐서 출력

🔎다시보기👀

그리디 알고리즘을 사용하여 푸는 문제로 큰 숫자를 최대한 앞으로 배치하는 게 목표라는 걸 정확하게 이해하고 풀어야 한다. 스택을 사용해서 숫자를 순차적으로 처리하고, 스택의 마지막 숫자보다 현재의 숫자가 클 경우에는 k의 개수만큼 스택의 마지막 숫자를 제거해가면서 큰 숫자를 유지해야 한다.

0개의 댓글