[Python/Programmers] 큰 수 만들기

정나린·2022년 3월 14일

문제

1. 난이도: 프로그래머스 Level 2

2. 문제요약:

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

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

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

3. 문제핵심: 그리디(Greedy) 알고리즘

  • 그리디 알고리즘: 선택의 순간마다 최적의 상황만을 쫓아 최종적인 해답에 도달하는 방법
  • 그리디 알고리즘의 최종적인 해답이 항상 최적의 해답은 아니다.
  • ex) 동전의 개수를 최소로 하는 동전의 조합

내 코드

def solution(number, k):
    answer = ''
    targetLength = len(number)-k
    tempList = number
    
    while len(answer) < targetLength:
        tempList = tempList[:-(targetLength-len(answer)-1)]
        
        if tempList:
            maxNum = max(tempList)
            maxIndex = tempList.index(maxNum)
            answer += maxNum
            tempList = number[maxIndex+1:]
            number = tempList
            
        else: 
            return answer + max(number)
  • 10번째 테스트 케이스에서 시간초과
  • 나름 시간 효율성을 위해, tempList의 길이를 줄임
    - tempList = tempList[:-(targetLength-len(answer)-1)]
    - -(targetLength-len(answer)-1): 최소한으로 고를 수 있는 숫자들을 남겨두기 위해
  • max(list): O(1), list.index(element): O(N)보다 for문의 시간 효율성이 좋다길래 for문으로 바꿔봤지만 10번째 테스트 케이스만 안됐음
    - for문으로 해도 어차피 O(N)였음..
    - 그럼에도 문제가 될만한 요소는 max()나 index()밖에 없음..!

이상 코드

def solution(number, k):
    stack = [number[0]]
    for num in number[1:]:
        while len(stack) > 0 and stack[-1] < num and k > 0:
        	stack.pop()
            k -= 1
        stack.append(num)
    if k != 0:
        stack = stack[:-k]
    return ''.join(stack)
  • 핵심
    - stack은 큰 수터 채워져 있다 -> "그리디 알고리즘"
  • number = '12391' k=2라는 상황을 가정
  • 동전 문제에서 N원짜리의 개수: k , 각 동전의 가치: stack[-1]

0개의 댓글