[programmers/CodingTest/Python]大数を作成


問題の説明


ある数字からk個の数字を削除しようとしたときに得られる最大の数字を取得しようとします.
たとえば、2つの数字が1924から削除された場合、[19,12,14,14,92,94,24]を作成することができる.このうち最大の数字は94です.
解関数のパラメータとして文字列形式で与えられた数値と削除する数値kを用いる.solution関数を完了し、numberからk個の数値を削除したときに作成できる最大数値を文字列で返します.

せいげんじょうけん

  • は、1桁より大きく、100000桁未満の数字です.
  • kは、1または複数のビット数未満の自然数である.
  • I/O例

    number	k	return
    "1924"	2	"94"
    "1231234"	3	"3234"
    "4177252841"	4	"775841"

    方法


    最初に、i番号がi+1番より小さい場合は、i番号を削除するように記述される.しかしテストケースでは失敗し,様々な方法を考えているうちにスタックを使用するヒントを見つけた.
    スタックに数字iの1番目の数字を入れ、スタックの-1番目の数字が数字iの1番目の数字以上になるまでスタックをポップアップします.このプロシージャはnumber全体を巡り、スタック内の数を文字列に結合して解決します.ここで、パージ数の個数がkより小さい場合は、スタックの[:-k]のみをとる.
  • スタックの配列答えを使用すると発表した.
  • numberを巡るiを一周します.
    ->答えが空の場合は、答えにiを入れて次の繰り返しを行います.
    ->kが0より大きい場合、
    -->答え[-1]がiより小さいときに繰り返し、ドアを回します.
    ----->答えをポップアップし、kを1に減らします.
    ----->答えが空、またはkが0未満の場合、while文を終了します.
    ->答えにiを入れる.
  • kが0より大きい場合(消去数がkより小さい場合)
    ->回答に答えを更新します[:-k].
  • の結果を入れる変数の結果を宣言し、文字列に答えを入れます.
  • は、
  • の結果を返します.
  • solution.py

    def solution(number, k):
        answer = []
        for i in number:
            if not answer:
                answer.append(i)
                continue
            if k>0:
                while answer[-1]<i:
                    answer.pop()
                    k-=1
                    if not answer or k<=0:
                        break
            answer.append(i)
        if k>0:
            answer=answer[:-k]
        result=''.join(answer)
        return result