[プログラマー42883 Python]作成大数(level 2,greedy)


アルゴリズムタイプ:Griddy
草は参考にならずに自分で解いたのか.X
https://programmers.co.kr/learn/courses/30/lessons/42883?language=python3
ソースコード(Python)
def solution(number, k):
    answer = ''
    # 원본 변조를 피하기 위해 다른 변수에 카피해서 조작
    k_copy = k
    # 최종적으로 결과 값을 담아낼 스택
    bigger = []
    
    for num in number:
        num = int(num)
        
        # 스택에 숫자가 존재하고, 제거 횟수가 남아있고, 스택의 마지막 숫자가 현재 순회 숫자보다 작은 동안 계속 스택을 pop하고 제거 횟수를 1 감소시킨다.
        while len(bigger) > 0 and k_copy > 0 and bigger[-1] < num:
            bigger.pop()
            k_copy -= 1
        
        # while이 끝나고 현재 순회 숫자를 스택에 추가한다.
        # 두 구문의 의미를 요약하면, 우선 number의 모든 숫자를 for로 순회한다. 각 숫자에 대해, 스택의 마지막 숫자부터 비교해서 자신보다 작은 것들을 모두 pop하여 제거하고 자신을 스택에 추가한다. 이 과정 자체가 그리디이다.
        # 각 순회 단계의 숫자에 대해, 지금까지 쌓아 만든 숫자 스택에 대해, 자신이 특정 자릿수의 숫자를 대신해서 들어가려면, 원본 숫자들의 배치 순서를 그대로 지켜야하므로 원래 있던 숫자를 제거하고 자신이 들어가야만 한다.
        bigger.append(num)
    
    # number = 97865, k = 1인 경우를 생각해보자.
    # 그럼 stack에는 9865가 들어가있고 k는 1이 남아있다.
    # 이렇듯, 마지막 즈음에서 비교하려는 숫자 쌍이 내림차순으로 이미 잘 배치되어있다면 원래 있던 숫자를 제거하지 않고 자신을 스택에 추가하게 된다.
    # 이런 경우, 뒤에서 k만큼의 숫자를 그냥 빼버리고 출력해주면 된다. 뒤에서 k만큼의 숫자들이 while 로직에 따라 내림차순으로 되어있기 때문에 그대로 빼줘버리면 되는 것이다.
    if k_copy != 0:
        bigger = bigger[:-k_copy]
        
    answer = "".join(map(str, bigger))

    return answer
プールの概要
  • スタックのグリディフォードを使用します.

  • numberのすべての数字は左から巡回します.
    各サイクルの数値numについて、スタックの一番後ろの数値から比較し、削除回数がまだ存在し、numがスタックの最後の数値より大きい場合は、スタックの最後の数値を削除し、numを挿入します.もちろん、このような状況が発生しない前に、whileゲートを迂回してクリアし、最後にnumをスタックに入れます.
    これがグリディ概念の応用部分であり、大きな数字を求めるためには、最も高い桁数に最大の数字を加えるのが一般的である.従って、既に得られている最大数「スタック」ではnumをスタックの最後の数字から比較し、自分が達成できる最大桁数まで押し込み、位置を占めている.

  • このとき注意すべき点はnumber=97865,k=1であり、forが回転するとstackは9865,k=1となる.クリア回数もあります.
    この場合、ある程度降順配列がある部分が多くなると、それぞれの場合、スタックの最後の位置にnumが追加され、最後に戻るまでkが残ります.
    この場合、stackの最後のkまでの数字は降順に並べなければなりません.(whileロジックによる)
    したがって、現在のstackの9865から最終的にk(=1)個を削除する986は、9865でkが消費され、作成される最大数である.
  • 勉強するところ、難しいところ
  • これまで、グリンディ問題といえば、単純なforやifの使用から事故から抜け出すことはできなかったようだ.このようにスタックを使用するには、さまざまな技術のGRADYタイプを使用してみましょう.
  • ギリシャのアイデアを思いつくのは難しい.最後はやはり人の解答を参考にします.