[Programmers/Python] 탐욕법 - 큰 수 만들기

Frye 'de Bacon·2023년 11월 3일
0

코딩테스트

목록 보기
13/45

Programmers - 큰 수 만들기

문제

어떤 숫자에서 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"


풀이

설계

해결에 상당히 오래 걸렸는데, 키는 LIFO(Last In First Out)을 이용하는 것이었다.

  1. 우선 number의 첫 번째 수를 넣어 리스트(answer)를 만든다.
  2. number의 두 번째 수부터 순회하면서 answer의 마지막 값과 비교한다.
    • 만약 순회 중인 number의 수가 answer의 마지막 수보다 작다면 answer에 추가한다.
    • k가 0보다 크고(즉, 제거할 수 있는 수가 아직 남아 있고), 순회 중인 number의 수가 answer의 마지막 수보다 크다면 answer에서 마지막 수를 제거하고 k를 1씩 줄인다.
    • 만약 answer가 빈다면 반복문을 멈추고 순회 중인 number의 수를 answer에 추가한다.
  3. k가 0이 될 때까지 반복한다면 answer가 정답이 되는데, 이때 number의 숫자들이 내림차순으로 정렬되는 경우, 즉 앞의 숫자보다 뒤의 숫자가 큰 경우가 없는 경우도 존재한다. 이 경우에는 answer의 뒤에서부터 k만큼 수를 제거하여 반환한다.

코드

def solution(number, k):

    answer = [number[0]]  # number의 첫 번째 수를 넣어 리스트를 만든다.

    for digit in number[1:]:  # number의 두 번째 수부터 순회 시작
        while k > 0 and answer[-1] < digit:  # k가 0보다 크고 순회 중인 number의 수가 answer의 마지막 수보다 크다면
            answer.pop()  # answer의 마지막 수부터 제거하고 k를 1씩 줄인다.
            k -= 1
            if not answer:  # answer가 비게 될 경우 반복문을 정지
                break
        answer.append(digit)  # 순회 중인 number의 수를 answer의 끝에 추가한다.

    return "".join(answer[:len(answer)-k])
    # 앞의 수보다 뒤의 수가 큰 경우가 없다면 k가 줄어들지 않으므로, 이 경우 뒤에서부터 k만큼을 제거한다.

자력으로 풀었다고는 못 하고, 검색의 도움을 상당히 많이 받았다. 단순히 탐욕법의 개념만 사용하는 것이 아니라 스택을 활용해야 한다는 것까지 생각이 미치지를 않는 듯.

profile
AI, NLP, Data analysis로 나아가고자 하는 개발자 지망생

0개의 댓글

관련 채용 정보