[白準17298]おお大数(Python)
6086 ワード
1.アイデア
巡視に向かう過程で、30分でスタックを利用して問題を解決する方法を考えたが、まだ考えていない.だから私は逆巡視して、問題を解決しようとしたが、成功した.
配列の最後の要素を
stack
に挿入し、次の要素から逆ブラウズを開始します.現在のインデックスによって指数付けされた要素は、stack
に格納された最後の要素と比較される.popは、stack
の最後の要素が現在のインデックスが指す配列の要素よりも大きいまで演算される.次に、その要素(stack
の最後の要素)を別の変数に書き込む.残りのstack
がなければ−1を記録する.その後、現在のインデックスによって指数付けされたグループの要素値がstack
に挿入される.白準例入力1を使用して説明する場合、入力された配列(
arr
)、[3, 5, 2, 7]
、および大きな数を含む配列、およびanswer
のすべての要素は、−1に初期化される.まず、
arr
の最後の要素をstack
に挿入する.そのためstack = [7]
です.次いで、arr
の最後に、第2の要素から第1の要素への逆探索が行われる.arr[2]
は2であり、stack
より小さい最後の要素7である.そのためanswer[2]=7
です.2をstack
に挿入します.arr[1]
は5です.5はstack
より大きい最後の要素2である.従ってstack
においてpop.pop演算の後、stack
の最後の要素は7である.7は5より大きく、answer[1]=7
です.次に、stack
に5を挿入する.arr[0]
は3です.3 stack
未満の最後の要素5.そのためanswer[0]=5
です.したがって、正解は
[5,7,7,-1]
です.2.コード
import sys
n = int(sys.stdin.readline().rstrip())
arr = list(map(int, sys.stdin.readline().rsplit()))
def solve():
if n == 1: return [-1]
answer = [-1 for _ in range(n)]
stack = []
stack.append(arr[-1])
for i in range(n-2, -1, -1):
while stack and arr[i] >= stack[-1]: stack.pop()
answer[i] = -1 if not stack else stack[-1]
stack.append(arr[i])
return answer
answer = solve()
for a in answer: print(a, end=' ')
Reference
この問題について([白準17298]おお大数(Python)), 我々は、より多くの情報をここで見つけました https://velog.io/@study-dev347/백준-17298-오큰수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol