[伯俊#5430]コミュニケーション


1.問題の説明




2.解説


一見、指示通りに実施すれば良いのではないでしょうか.ただし、時間制限は1初期なので、効率性を考慮して解決します.逆順序ソートを行うにはO(n)の時間的複雑さが必要であり、list.pop(0)の演算も同様に消去して前に引く必要があるため、O(n)の時間が必要である.また,この繰返し命令の個数のため,合計O(n^2)時間が必要であり,当然タイムアウトする.
まず、「R」は反転配列の関数であり、Rが2回入ると反転の意味がないので削除し、revと表記された場合、反転された場合はTrueとし、そうでない場合はFalseとする.そして、削除演算を行う場合には、revに従って1つのインデックスを前倒しまたは後回しにして削除処理を行う.出力は、前後を指すインデックスの和がn以下であることのみが正しい出力であり、そうでなければerrorに戻って終了する.

3.コード

from sys import stdin
input = stdin.readline

def solution(cmds, nums, n):
    cmds.replace('RR', '') #뒤집기를 두 번 하면 뒤집지 않는 것과 같음
    s, e, rev = 0, 0, False
    for cmd in cmds:
        if cmd == 'R':
            rev = not rev
        elif cmd == 'D':
            if not rev: #역순정렬이 아닐 경우
                s += 1
            else:
                e += 1
        
    if s+e <= n:
        res = nums[s:n - e]
        if not rev:
            return '['+','.join(res)+']'
        else:
            return '['+','.join(res[::-1])+']'
    else:
        return 'error'

T = int(input())
for _ in range(T):
    cmds = input()
    n = int(input())
    nums = input().rstrip()[1:-1].split(',')
    if n==0: []
    ans = solution(cmds, nums, n)
    print(ans)

4.雑談


最近はプログラマーの問題だけを解いて、久しぶりに白俊の問題を解いたが、白俊は入出力形式をよく見て、ちょっと面倒な感じがした.外部IDEを使用する必要がありますか?とにかくこれを改善できれば白俊もいいんだけど….