解説つき!競ってわかる はじめてpythonプログラミング

競プロの情報発信と備忘録を兼ねている

ABC237D

ABC237D の解説

atcoder.jp

 

解答コード

https://atcoder.jp/contests/abc237/submissions/28965017

 

問題

1からNまでの数字をリストに挿入していく問題です.
各数字ごとに"L" or "R" の文字列が与えられて,
Lの時は直前の数字の左に,
Rの時は直前の数字の右に数字を挿入していきます.

 

解説

0, 1, ,2, ..., Nの順に挿入していくのではなく,逆順のN, N-1, N-2, ..., 0 を挿入して実装しました.
公式解説ページのユーザー解説にある「両端キュー」の発想はなかった...> <

まず,dequeをimportします.

from collections import deque

 

標準入力を読み込みます.

N = int(input())
S = list(input())

 

deque には,はじめNが含まれています.ここにN-1以降の数字を挿入していきます.

dq = deque([N])

 

N-1の挿入について考えます.文字列が"L"であれば,N-1の左側にNが挿入されることを意味します.[N] -> [N-1, N]
つまり,今,逆順で考えていますので,文字列が"L"のとき,Nの右側にN-1を挿入していきます.

この点に留意して,キューに数字を追加していきます.

for i in range(N-1, -1, -1):
    s = S[i]
    if s == 'L':
        dq.append(i)
    else:
        dq.appendleft(i)

 

最後にdequeをlist型にもどして,出力します.

ans = list(dq)
print(*ans, sep=' ')

 

リストにせずともで同様の結果になりますが,明示的にansに代入しています.

print(*dq, sep=' ')

 

以上,ABC237Dの解法でした.