[BOJ]白俊2840号ラッキーホイール(Python)



質問する


尚徳は最近ラッキーホイールを購入した.尚徳は車輪の各節にアルファベットを大文字で書いた.下図に示すように.

車輪の同じ字は2回以上現れない.また、車輪は時計回りにしか回転しません.車輪の横に矢印があり、この矢印はいつも一つの場所を指しており、回転すると指す字が変わります.上図はHです.
尚徳は車輪を連続的にK回回転させる.ホイールを回すたびに、尚徳は紙に矢印が指す文字の変化回数と回転を止める文字数を書いた.
熙媛は尚徳が書いた紙を見つけた.その紙をもとに、尚徳は車輪のアルファベットを見つけようとした.
尚徳に紙に書かれた内容と車輪のスペース数を与える場合は、車輪に書かれたアルファベットを見つけるプログラムを作成します.

入力

  • 行目で車輪の格子数Nと尚徳が車輪を回転させた回数K.(2 ≤ N ≤ 25, 1 ≤ K ≤ 100)
  • の次の行から、K行は、車輪を回転させる際に矢印が指す文字が何度か変化したことを示すSと、回転を停止する際に指す文字を与える.(1 ≤ S ≤ 100)
  • しゅつりょく

  • の最初の行で、最後の回転矢印が指す文字から、車輪に書かれたアルファベットを時計回りに出力します.このとき、何の字か決められないチェックは?出力します.
  • 相徳が書いた紙に書いてあるラッキーホイールがなかったら"!出力します.

  • 入力します。

    3 3
    1 A
    2 B
    3 C

    出力します。

    !

    入力します。

    5 6
    1 A
    2 B
    5 B
    1 C
    2 A
    2 B

    出力します。

    B?A?C

    入力3

    8 8
    4 V
    3 I
    7 T
    7 A
    6 R
    5 N
    1 O
    9 H

    出力します。

    HONITAVR

    に答える

    n, k = map(int, input().split())
    circle = ['?'] * n
    
    for i in range(k):
        spin = input().split()
        # 한바퀴 넘어가는 경우에 기존 자리에서 바뀐 차이만큼을 구하기 위해 나머지 구함.
        s = int(spin[0]) % n
        s_char = str(spin[1])		# 문자
    
        # 큐가 아닌 리스트를 슬라이싱 한 후에 앞뒤 순서를 바꿔 다시 붙임.
        circle = circle[-s:] + circle[:-s]	
        # 움직인 후에 화살표가 가리키는 자리(circle[0])이 '?'일 때
        if circle[0] == '?':
        	# 입력된 문자가 이미 다른 자리에 존재하는 경우, 바퀴 존재하지 않음
            if s_char in circle:
                print('!')
                break
            # 처음 넣는 문자일 경우, 해당 자리에 문자 넣음.
            circle[0] = s_char
        # 화살표가 가리키는 자리가 현재 문자와 같은 경우 넘김.
        elif circle[0] == s_char:
            continue
        # 화살표가 가리키는 자리에 현재 문자와 다른 문자가 존재함. 자리가 겹치므로 바퀴 성립 X
        else:
            print('!')
            break
    # 반복문이 모두 실행된 후에 바퀴 문자 출력
    else:
        print("".join(circle))
    文字を時計回りに回す順番は反時計回りです.
    出力は時計回りになります.
    回り道をする.circle[0]を矢印が指す位置に指定することで問題を解決します.