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

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

코딩테스트

목록 보기
13/45
post-custom-banner

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로 나아가고자 하는 개발자 지망생
post-custom-banner

0개의 댓글